Java 使用继承重写@RequestMapping方法

Java 使用继承重写@RequestMapping方法,java,spring,spring-mvc,inheritance,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(@PathVariab

在我的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]
}
@RequestMapping(
value=“/{id}”,
方法=RequestMethod.PUT,
使用={MediaType.APPLICATION\u JSON\u VALUE}
)
public@ResponseBody ResponseEntity更新(@PathVariable ID,
@RequestParam字符串标记,@RequestBody T json){
[做些花哨的事]
}
还有一个扩展类,我们称之为
MyController
。通常我想使用抽象类中的方法,但是在
MyController
中,我有一个特例(耶!),所以我需要做进一步的工作

我的想法是只覆盖子类中的
@RequestMapping
,做我的
额外的花哨工作
,然后从
MyController.update
方法调用超级类的update方法。但这不起作用,因为我在编译过程中遇到了一个不明确的映射错误


有没有办法让Spring重写父类请求映射?我希望避免拆分路由。

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

如果您想要执行一些额外的代码,您可以使用类似的方法。因此,在
AbstractRESTController
中定义一个空方法,如下所示:

protected void doFancyStuff() {

}
Obs.:空方法在这里是一个更好的选择,而不是一个
抽象的
方法,以避免在所有具体的控制器中即使使用空方法体也需要实现

将更新方法更改为调用钩子方法:

@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();
}
@RequestMapping(
value=“/{id}”,
方法=RequestMethod.PUT,
使用={MediaType.APPLICATION\u JSON\u VALUE}
)
public@ResponseBody ResponseEntity更新(@PathVariable ID,
@RequestParam字符串标记,@RequestBody T json){
doFancyStuff();
}

MyController
中,您将重写并实现
doFancyStuff
方法。

由于路由旨在指向特定的方法,我认为您无法完全按照这种方式完成。也许,如果您在一个单独的方法中处理请求,并在那些需要自己实现的子类中重写该方法,我真的很喜欢这个想法,它对我很有用。我不认为这是100%优雅,但可能仍然是这种情况下的最佳解决方案。@Dexperlin我同意你的看法,这不是100%优雅。我喜欢使用诸如
doBeforeUpdate
doAfterUpdate
等方法来抽象常见和特定的行为。我有一个AbstractCtrl来调用我的服务rest层。这个解决方案非常适合。