【问题标题】:Create annotation setting @RequestMapping parameters using Spring MVC使用 Spring MVC 创建注解设置@RequestMapping 参数
【发布时间】:2014-11-20 21:20:39
【问题描述】:

是否可以使用预定义的一组参数创建等效于 Spring MVC @RequestMapping 的 Java 注释?

例如,让我可以简单地使用的东西:

@PostJson("/input")
public Output myMethod(Input input) {

代替:

@RequestMapping(value = "/input",
    method = RequestMethod.POST,
    produces = MediaType.APPLICATION_JSON_VALUE, 
    consumes = MediaType.APPLICATION_JSON_VALUE)
public Output myMethod(Input input) {

更新: 让我尝试更深入地挖掘。 AFAIK,Spring 似乎能够在扫描 bean 时处理元注释。例如,如果我创建一个注解,比如说@MyComponent,然后用@Component 进行注解:

@Component
public @interface MyComponent {
    String value() default "";
}

Spring 似乎能够找到带有@MyComponent 的bean 并识别@MyComponent 中的参数(在这种情况下为值),就好像它们来自@Component 一样

@MyComponent("MyBean")
public class SomeClass {

我用@RequestMapping 尝试过类似的策略

@RequestMapping(method = RequestMethod.POST, 
    produces = MediaType.APPLICATION_JSON_VALUE)
public @interface PostJson {
    String value() default "";
}

固定参数(产生的方法)似乎是正确的,但可变参数(值)被忽略了。

我希望这不是@Component 特有的功能,我可以将它与@RequestMapping 一起使用。

【问题讨论】:

  • 所以,不,@Component 的元注释行为不适用于@RequestMapping。正如我在下面所说的,@RequestMappingRequestMappingHandlerMapping 处理,它不检查其他任何内容。

标签: java spring spring-mvc


【解决方案1】:

不容易,不。 @RequestMapping 注释绑定到 RequestMappingHandlerMappingRequestMappingHandlerAdapter。当您提供<mvc:annotation-driven />@EnabledWebMvc 时,这些是默认注册的MVC 堆栈的两个元素。他们只扫描@Controller@RequestMapping,没有别的。

要使您自己的注释工作,您必须覆盖(并注册)这两个或从头开始创建新的,以提供对处理程序方法的扫描和处理。 You can get some inspiration from those classes 和其他 HandlerMapping implementations,但这确实不是一个简单的任务。

或者,您可能想查看Java Restful Web Services,它可以很好地与 Spring 集成(但不一定是 Spring MVC)。当您确切知道自己想要什么时,它可以提供一些不那么臃肿的映射注释。

【讨论】:

    【解决方案2】:

    虽然目前不支持开箱即用但会支持(感谢创建https://jira.spring.io/browse/SPR-12296!),但这并不难。如果您查看 RequestMappingHandlerMapping,则受保护的方法 getMappingForMethod 接受一个方法并返回一个 RequestMappingInfo,其中填充了来自类型 + 方法级 @RequestMapping 注释的信息。但是,您可以从任何内容填充此 RequestMappingInfo,例如您自己的注释或其他一些来源(外部路由配置)。只需按照那里的代码示例即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 2014-07-11
      • 2017-05-15
      • 1970-01-01
      • 2021-10-24
      • 1970-01-01
      相关资源
      最近更新 更多