Spring MVC @RequestMapping继承


问题内容

来自Struts2,我习惯@Namespace在超类(或package- info.java)上声明批注,继承类随后会在@Namespace其祖先的批注中获取值并将其添加到Action的请求路径中。我现在正尝试在Spring
MVC中使用@RequestMapping注解(如下所示,为简洁起见而修剪代码)执行类似的操作:

package au.test

@RequestMapping(value = "/")
public abstract class AbstractController {
    ...
}

au.test.user

@RequestMapping(value = "/user")
public abstract class AbstractUserController extends AbstractController {

    @RequestMapping(value = "/dashboard")   
    public String dashboard() {
        ....
    }
}

au.test.user.twitter

@RequestMapping(value = "/twitter")
public abstract class AbstractTwitterController extends AbstractUserController {
    ...
}

public abstract class TwitterController extends AbstractTwitterController {

    @RequestMapping(value = "/updateStatus")    
    public String updateStatus() {
        ....
    }
}
  • / 按预期工作
  • /user/dashboard 按预期工作
  • 但是,当我期望/user/twitter/updateStatus它不能工作并且检查日志时,我可以看到一个类似于以下内容的日志条目:

org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping-
将URL路径[/ tweeter / updateStatus]映射到处理程序’twitterController’

我是否可以启用一个设置,该设置将扫描超类以查找@RequestMapping注释并构造正确的路径?

我也认为@RequestMapping在包装中定义package-info.java是非法的?


问题答案:

以下基本上成为 /tweeter/updateStatus 和不 /user/tweeter/updateStatus

public abstract class TwitterController extends AbstractTwitterController {

    @RequestMapping(value = "/updateStatus")    
    public String updateStatus() {
        ....
    }
}

这是预期的行为,因为您已覆盖@RequestMappingAbstractController和中声明的原始内容AbstractUserController

实际上,当您声明AbstractUserController它也覆盖了@RequestMappingfor时AbstractController。它只是给您一种幻象,即/中的/
AbstractController已被继承。

“是否有我可以启用的设置,该设置将扫描超类以查找@RequestMapping注释并构建正确的路径?” 从来没听说过。