2009-11-28 50 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() { ... } 
} 

这是非常接近原来的第三个片段,除非你忘了领先/。