Java 使用继承重写@RequestMapping方法
在我的Java Spring MVC 4项目中,我有一个带有更新方法的AbstractRESTController: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
@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层。这个解决方案非常适合。