自定义@RequestMapping注释

时间:2015-08-07 13:06:52

标签: spring annotations request-mapping

我的弹簧控制器中有很少的方法映射在同一条路径上,例如。

    @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我希望使用已经包含这些值的自定义接口来注释方法

1 个答案:

答案 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版本