2009-11-28 51 views
4

使用基於註釋的控制器映射。Spring MVC對控制器映射非常困惑

@Controller 
public class AlertsController { 

    @RequestMapping(value="create", method=RequestMethod.GET) 
    public void create(HttpServletRequest request, Model model) { 
    } 
} 

當訪問alerts/create,我得到的消息Does your handler implement a supported interface like Controller?。這看起來很奇怪,與文檔所說的相反。

所以,我在RequestMapping添加到類:

@Controller 
@RequestMapping("/alerts") 
public class AlertsController { 

    @RequestMapping(value="create", method=RequestMethod.GET) 
    public void create(HttpServletRequest request, Model model) { 
    } 
} 

那麼,這工作。我不應該需要@RequestMapping,但我確實需要。現在,事情變得怪異。我真的想這個到`/型材/警報,所以我把它改成這樣:

@Controller 
@RequestMapping("/profile/alerts") 
public class AlertsController { 

    @RequestMapping(value="create", method=RequestMethod.GET) 
    public void create(HttpServletRequest request, Model model) { 
    } 
} 

,我得到一個404去profile/alerts/create的時候,但它仍然被映射到/alerts/create出於某種原因? ?!?!

我將其更改爲:

@Controller 
@RequestMapping("foobar") 
public class AlertsController { 

    @RequestMapping(value="create", method=RequestMethod.GET) 
    public void create(HttpServletRequest request, Model model) { 
    } 
} 

這是很奇怪的,令人難以置信的不便。任何人都有辦法解決這個問題,甚至可以調試發生了什麼?

回答

4

在您的第一個片段中,您錯過了領先的/。它應該像@RequestMapping(value="/create", method=RequestMethod.GET)

現在你應該而且你的第三個片段改成這樣,

@Controller 
public class AlertsController { 

    @RequestMapping(value="/profile/alerts/create", method=RequestMethod.GET) 
    public void create(HttpServletRequest request, Model model) { 
    } 
} 

,因爲你正在你的方法void其預期的DispatcherServlet依傍的「默認視圖名稱資料/警示/創建」。然後它與一個合適的視圖解析器相結合。例如,

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="prefix" value="/WEB-INF/jsp/" /> 
    <property name="suffix" value=".jsp" /> 
</bean> 

在那裏你有404,可能是。

+0

我有視圖解析器,這確實奏效。奇怪的是我認爲方法上的@ RequestMapping註解是對類級註釋的改進;它似乎不是。 – davetron5000 2009-11-28 14:45:20

0

您可以對類註解和方法上更細粒度的URL進行匹配。類級註釋被前置到方法級別的註釋

@Controller 
@RequestMapping(value = "/admin") 
public class AdminController { 

    @RequestMapping(value = "/users", method = RequestMethod.GET) 
    /* matches on /admin/users */ 
    public string users() { ... } 
} 

這是非常接近原來的第三個片段,除非你忘了領先/。