我的弹簧控制器中有很少的方法映射在同一条路径上,例如。
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
protected ResourceDTO getById(@PathVariable int id) {
return super.getById(id);
}
我想知道是否有办法创建一个自动设置值和方法的注释,有这样的东西:
@RequestMappingGetByID
protected ResourceDTO getById(@PathVariable int id) {
return super.getById(id);
}
每个人都过得愉快
更新 这样做的目标如下 我的所有控制器(例如用户,订单,客户端)扩展了一个参数化的BaseController,它包含一组基本功能(通过id,保存,更新,删除等获取)所有逻辑都在BaseController上,但为了映射值我必须在特定控制器上添加注释。 而不是一直写{id}和post我希望使用已经包含这些值的自定义接口来注释方法
答案 0 :(得分:2)
以下是我测试的Spring 4.1.x的工作原理:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
@interface RequestMappingGetByID {
}
然后你可以使用
@RequestMappingGetByID
protected ResourceDTO getById(@PathVariable int id) {
return super.getById(id);
}
就像你提到的那样。
这种注释是Spring称之为元注释。查看文档的this部分
我不确定这个元注释是否适用于4.x之前的Spring版本,但是由于Spring在3.x行中有一些元注释处理功能,所以它肯定是可能的
如果你在使用Groovy的地方,你也可以利用@AnnotationCollector
AST,这实际上可以保留源代码的重复,但会将常规的@RequestMapping
注释推送到生成的字节码。查看this了解详情。
在这种情况下的好处是Spring不需要配备元注释读取功能,并且解决方案可能适用于较旧的Spring版本