【问题标题】:Custom @RequestMapping annotation自定义 @RequestMapping 注解
【发布时间】:2015-08-07 13:06:51
【问题描述】:

我的 spring 控制器中有几个方法映射在同一路径上,例如。

    @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} 并发布我想用已经包含这些值的自定义接口来注释方法

【问题讨论】:

  • 自定义注解的目标是消除(value = "/{id}", method = RequestMethod.GET)。您能否详细说明这样做的意图?您的所有路由都是 G​​ET 请求并具有 id 路径变量吗?
  • 你试过用@RequestMapping(value = "/{id}", method = RequestMethod.GET)注释RequestMappingGetByID。它应该适用于 Spring 4.x

标签: spring annotations request-mapping


【解决方案1】:

以下适用于我测试的 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 版本

【讨论】:

  • 春季版:4.0.2.RELEASE,有效。干净又容易。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-24
  • 2014-07-11
  • 2017-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-13
相关资源
最近更新 更多