SpringMVC中的RequestMapping注解继承问题
示例代码
搞两个Action类,一个父类Action,一个继承了该父类的子类Action
子类:ChildrenAction
@RestController
@RequestMapping("/json/query")
public class ChildrenAction extends ParentAction{
//重写父类方法
public ServiceResult queryData(@RequestParam Map<String, Object> paramMap) {
System.out.println("这里是子类Action的查询方法");
}
}
父类:ParentAction
public abstract class ParentAction{
@RequestMapping(value = "/query-data")
public ServiceResult queryData(@RequestParam Map<String, Object> paramMap) {
try {
System.out.println("这里是父类Action的查询方法");
} catch (Exception e) {
...
}
}
}
区别和注意点:
- 两个类有继承关系
- 父类类名上无注解,子类类名上有@RequestMapping注解
- 父类方法名上有@RequestMapping注解,子类方法名上无注解
- 子类重写了父类中的queryData方法,但子类方法上并没有@RequestMapping注解
- 父类Action是一个抽象类
前台请求路径:
- Request URL: http://locahost:8080/json/query/query-data 请求
- Request Method: POST
调用后打印结果
这里是子类Action的查询方法
经过验证后得到结论
@RequestMapping是可以被继承的,此时需要将父类的该方法覆盖(重写该方法),就可以使当前的@RequestMapping生效,此时/query-data
注解执行的是子类方法内的逻辑。
即:请求进来后先被路由到ChildrenAction类上(该类有@RequestMapping("/json/query")注解),然后由于子类重写了父类的queryData方法(父类方法上有@RequestMapping("/query-data")注解,符合请求的路径要求),此时SpringMVC的注解继承开始生效,子类成功调用自己的queryData方法
这种方式有利于同一类属性的功能进行自定义
具体的源码解析和原因分析有时间补充吧。。。