Spring MVC Controller配置 - 混合注释和XML @PathVariable

时间:2011-08-05 09:14:10

标签: java configuration spring-mvc annotations

我正在使用Spring MVC框架(v3)开发一个Web应用程序。

目前我定义了几个控制器类 - 我通过扩展MultiActionController创建它们,然后在我的web mvc XML配置中定义了bean和URL映射:

QuestionController.java:

public class QuestionController extends MultiActionController implements InitializingBean 
{

webmvc-CONFIG.XML

<bean id="questionController" class="com.tmm.enterprise.microblog.controller.QuestionController"></bean>
...
    <bean id="fullHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="alwaysUseFullPath" value="true" />
        <property name="mappings">
            <props>
                <prop key="/question/**">questionController</prop>
            </props>
        </property>
    </bean>  

这很好用,我在我的控制器中定义了与被调用的URL匹配的方法,一切正常(例如,我有一个list(..)方法,当我浏览到/question/list时,它被正确执行)

但是,对于这个特定的控制器,我想利用Spring中的@PathVariable选项来允许变量URL(例如我想要一个details(..)方法,当我调用/question/detail/9999时 - 其中9999是问题ID,该方法被执行)。我尝试使用如下:

QuestionController.java:

@RequestMapping("/detail/{questionId}")
public ModelAndView detail(@PathVariable("questionId") long questionId, HttpServletRequest request, HttpServletResponse response) throws Exception{

然而,当我运行上面的内容并得到时,我收到错误:

  

@PathVariable

中找不到questionId [@RequestMapping]

有没有人遇到过这个?是否可以将RequestMapping注释与现有的XML配置URL映射混合使用?

1 个答案:

答案 0 :(得分:4)

这是来自 DefaultAnnotationHandlerMapping 类的评论,如果我正在阅读评论权限,如果你在QuestionController.java的顶部添加@RequestMapping,它可能会解决你的问题

带注释的控制器通常标有{@link Controller}构造型 在类型级别。 {@link RequestMapping}时,这不是绝对必要的 在类型级别应用(因为这样的处理程序通常实现  {@link org.springframework.web.servlet.mvc.Controller}界面)。然而,  检测 {@ link RequestMapping} 注释需要 {@ link Controller}  如果类型级别不存在{@link RequestMapping},则方法级别

修改

你可以做一些这样的事情,将uri的 / question 部分移到顶部并离开 方法层面的细节部分

@RequestMapping("/question")
public class QuestionController
{
  @RequestMapping("/detail/{questionId}")
  public ModelAndView detail(@PathVariable("questionId") long questionId,    HttpServletRequest request, HttpServletResponse response) throws Exception{

}