使用Spring MVC创建注释设置@RequestMapping参数

时间:2014-09-25 23:34:28

标签: java spring spring-mvc

是否可以使用预定义的一组参数创建与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一起使用。

2 个答案:

答案 0 :(得分:3)

不容易,不。 @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)。当您确切知道自己想要什么时,它可以提供一些不那么臃肿的映射注释。

答案 1 :(得分:0)

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