簡體   English   中英

如何在Java + Spring中正確使用@PathVariable?

[英]How do I correctly use @PathVariable in Java+Spring?

我有一個控制器可以很好地處理其他請求映射,但是我很難@PathVariable@PathVariable注釋一起使用。

此示例中 (請參見“ 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'

春天有魔力; 參數順序很重要。 嘗試反轉處理程序參數的順序。 代替這個:

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/* ,在控制器中使用了@RequestMapping(“ / blammy / {value}”),然后將請求發送至“ {WEBROOT} / spring / blammy / testvalue”,其中“ {WEBROOT} ”是我的測試應用的網絡根目錄。

請求映射相對於調度程序Servlet映射的相對關系(默認情況下,請參閱DefaultAnnotationHandlerMappingAnnotationMethodHandlerAdapter alwaysUseFullPath屬性以獲取更多信息)。

如果您請求資源/ViewReport/jayson/fnord spring mvc正在尋找映射到fnord的處理程序。

您需要請求/ViewReport/jayson/ViewReport/jayson/fnord

您是否嘗試過@PathVariable(value =“ foobar”)字符串foobar

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM