java - 在Java+Spring中如何正确使用@PathVariable?

标签 java spring spring-mvc

我有一个可以很好地处理其他请求映射的 Controller ,但我在使用 @PathVariable 注释时遇到了困难。

this example (请参阅“URI 模板模式”)它有以下示例:

@RequestMapping(value="/owners/{ownerId}", method=RequestMethod.GET)
public String findOwner(@PathVariable String ownerId, Model model) {
    Owner owner = ownerService.findOwner(ownerId);
    model.addAttribute("owner", owner);
    return "displayOwner";
}

我的代码如下所示:

@RequestMapping( value="/ViewReport/json", method = RequestMethod.GET)
public ModelAndView TestJson(final Model model){
    model.addAttribute("fnord", "{\"hello\":\"awesome\"}"); 
    return new ModelAndView("reportViewJson");  
}    

@RequestMapping( value="/ViewReport/jayson/{foobar}", method = RequestMethod.GET)
public ModelAndView TestJayz(final Model model, @PathVariable String foobar){
    model.addAttribute("fnord", "{\"hello\":\""+foobar+"\"}");  
    return new ModelAndView("reportViewJson");  
} 

然后我有一个包含以下内容的 web.xml 文件:

  <servlet-mapping>
    <servlet-name>autoreport</servlet-name>
    <url-pattern>/ViewReport/jayson/*</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>autoreport</servlet-name>
    <url-pattern>/ViewReport/json</url-pattern>
  </servlet-mapping>

现在,当我导航到 /ViewReport/json 时,我得到了 JSON {"hello": "awesome"} 正如我所期望的。但是,当我导航到 /ViewReport/jayson/42 时,我得到

HTTP Status 404 -

type Status report

message

description The requested resource () is not available.

Apache Tomcat/7.0.29

我使用 PathVariable 时做错了什么,我需要做什么来修复它?

更新

当我的服务器启动时,它会输出这些行:

[ INFO] 14:15(AbstractUrlHandlerMapping.java:registerHandler:315)
Mapped URL path [/ViewReport/json.*] onto handler 'reportViewController'

[DEBUG] 14:15(AbstractBeanFactory.java:doGetBean:246)
Returning cached instance of singleton bean 'reportViewController'

[ INFO] 14:15(AbstractUrlHandlerMapping.java:registerHandler:315)
Mapped URL path [/ViewReport/json/] onto handler 'reportViewController'

[DEBUG] 14:15(AbstractBeanFactory.java:doGetBean:246)
Returning cached instance of singleton bean 'reportViewController'

[ INFO] 14:15(AbstractUrlHandlerMapping.java:registerHandler:315)
Mapped URL path [/ViewReport/jayson/{foobar}] onto handler 'reportViewController'

当我提出请求时,我得到:

[DEBUG] 20:45(DispatcherServlet.java:doService:823)
DispatcherServlet with name 'autoreport' processing GET request for [/ViewReport/jayson/fnord]

[ WARN] 20:45(DispatcherServlet.java:noHandlerFound:1108)
No mapping found for HTTP request with URI [/ViewReport/jayson/fnord] in DispatcherServlet with name 'autoreport'

最佳答案

Spring 有魔力;参数顺序很重要。 尝试颠倒处理程序参数的顺序。 而不是这个:

public ModelAndView TestJayz(final Model model, @PathVariable String foobar)

试试这个:

public ModelAndView TestJayz(@PathVariable String foobar, final Model model)

采取2:

尝试将 web.xml 中的映射更改为更通用的内容。例如:

<servlet-mapping>
    <servlet-name>autoreport</servlet-name>
    <url-pattern>/ViewReport/*</url-pattern>
</servlet-mapping>

我在测试 web.xml 中使用了 /spring/* ,在 Controller 中使用了 @RequestMapping("/blammy/{value}") ,然后将请求发送到“{WEBROOT}/spring/blammy/testvalue”,其中“{WEBROOT}”是我的测试应用程序的网络根目录。

关于java - 在Java+Spring中如何正确使用@PathVariable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20575776/

相关文章:

spring - 如何在 kotlin 中使用 spring 数据和 r2dbc 映射一个类

html - 如何在填充表的循环内的 thymeleaf 中执行 if else

java - 在 Java Stream 中重用相同的值

java - 使用 System.load(dll) 执行 JAVA 应用程序

java - Controller 的 MockMvc 测试用例中出现错误

java - Spring 在使用 * classpath 时没有这样的 bean

java - 身份验证 Spring SOAP 到 Workday

java - 刷新页面后不考虑 utf8 html 输入标记

java - spring4中如何配置多个 View 解析器?

java - 这样解释变量声明