使用继承覆盖 @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
方法。
在我的 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
方法。