java - 使用继承覆盖 @RequestMapping 方法

标签 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,做我的额外的花哨的东西,然后从调用父类(super class)的更新方法MyController.update 方法。但这不起作用,因为我在编译过程中遇到了不明确的映射错误。

有没有办法让Spring重写父类请求映射?我想避免分割路线。

最佳答案

正如您所注意到的,您无法执行此操作,因为映射不明确。

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

protected void doFancyStuff() {

}

观察:空方法在这里是更好的选择,而不是抽象方法,以避免在所有具体 Controller 中即使使用空方法体也需要实现。

将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 - 使用继承覆盖 @RequestMapping 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27905856/

相关文章:

java - Iterable 实现中的 Lambda 表达式

rest - Spring MVC 中的内容协商

java - 如何获取格式为 AM/PM 的请求参数(小时)

spring - 在 Spring Sessions 上从 Redis 反序列化 Oauth2 session 时出现异常

java - 如果当前 url 不以 "/"(斜杠)结尾,则链接不起作用

java - 带有 Spring Boot 和 ibm JDBC 驱动程序的 ClassNotFoundException

java - 如何在类图 (UML) 中显示方法是同步的?

java - java中如何获取词干后的符号

java - 使用 Spring Boot @WebMvcTest 进行测试时如何从我的上下文中排除其他 @Controller

spring - 消息发送后立即检索 JMS header 而不消耗消息