使用继承覆盖@RequestMapping方法

时间:2015-01-12 15:53:09

标签: java spring spring-mvc inheritance

在我的Java Spring MVC 4项目中,我有一个带有更新方法的AbstractRESTController:

@RequestMapping(
        value="/{id}",
        method=RequestMethod.PUT,
        consumes={MediaType.APPLICATION_JSON_VALUE}
)
public @ResponseBody ResponseEntity<T> update(@PathVariable ID id, 
    @RequestParam String token, @RequestBody T json) {
        [do fancy stuff]
}

和扩展课程,我们称之为MyController。通常我想使用抽象类中的方法,但在MyController我有一个特殊情况(是的!),所以我需要做进一步的工作。

我的想法只是覆盖子类中的@RequestMapping,执行我的additional fancy stuff然后调用超级班级&#39;来自MyController.update方法的更新方法。但是这不起作用,因为我在编译期间遇到了模糊的映射错误。

有没有办法让Spring覆盖父类请求映射?我想避免拆分路线。

1 个答案:

答案 0 :(得分:3)

正如您所注意到的那样,由于模糊映射,您无法做到这一点。

如果您想执行一些额外的代码,可以使用hook methods之类的内容。所以,在你的AbstractRESTController中定义一个这样的空方法:

protected void doFancyStuff() {

}

Obs。:这里的空方法是更好的选择,而不是abstract,这样就可以避免在所有具体控制器中使用空方法体来实现。

更改update方法以调用hook方法:

@RequestMapping(
        value="/{id}",
        method=RequestMethod.PUT,
        consumes={MediaType.APPLICATION_JSON_VALUE}
)
public @ResponseBody ResponseEntity<T> update(@PathVariable ID id, 
    @RequestParam String token, @RequestBody T json) {
        doFancyStuff();
}

MyController中,您将覆盖并实施doFancyStuff方法。