使用继承覆盖 @RequestMapping 方法

Override @RequestMapping method using 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]
}

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

我的想法是覆盖子 class 中的 @RequestMapping,执行我的 additional fancy stuff 然后从 [= 调用超级 class' 更新方法15=] 方法。但这不起作用,因为我在编译过程中遇到了模糊映射错误。

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

正如您所注意到的,您不能这样做,因为映射不明确。

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

protected void doFancyStuff() {

}

Obs.: empty 方法在这里是更好的选择,而不是 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 方法。