Spring Controller:使用组合Spring注释的自定义注释不起作用

时间:2015-12-08 14:37:54

标签: java spring spring-mvc annotations

我正常使用Spring Controller,我有一个以下列方式映射的方法

@RequestMapping(
    value = "/users"
    consumes = MimeTypeUtils.APPLICATION_JSON_VALUE,
    produces = MimeTypeUtils.APPLICATION_JSON_VALUE,
    method = RequestMethod.GET)
@ResponseBody
@ResponseStatus(HttpStatus.OK)
public UserResponse retrieveUsers() {
    return new UserResponse();
}

@RequestMapping(
    value = "/contracts"
    consumes = MimeTypeUtils.APPLICATION_JSON_VALUE,
    produces = MimeTypeUtils.APPLICATION_JSON_VALUE,
    method = RequestMethod.GET)
@ResponseBody
@ResponseStatus(HttpStatus.OK)
public ContractResponse retrieveContracts() {
    return new ContractResponse();
}

此工作正常,GET请求已被接受,例如POST我收到正确的405状态代码。

现在我想介绍自定义组合注释,而不是在每个方法中都有相同的注释。

我的自定义注释看起来像,

@RequestMapping(
        consumes = MimeTypeUtils.APPLICATION_JSON_VALUE,
        produces = MimeTypeUtils.APPLICATION_JSON_VALUE,
        method = RequestMethod.GET)
@ResponseBody
@ResponseStatus(HttpStatus.OK)
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Get {}

因此,我将方法更改为

@Get
@RequestMapping(value = "/users")
public UserResponse retrieveUsers() {
    return new UserResponse();
}

在这种情况下,我可以看到无论我发送给/users的任何类型的请求,它都能正常提供。例如,即使我POST,我也会看到回复。因此@RequestMapping无效。

我在这里做错了什么?是否可以使用自定义组合注释使控制器正常运行?

2 个答案:

答案 0 :(得分:2)

您将覆盖在@RequestMapping注释中设置的@Get注释。因此,它仅指定请求映射的value部分,将所有其他属性保留为默认值。

答案 1 :(得分:2)

我怀疑@RequestMapping(value = "/users")上的UserResponse#retrieveUsers取代@RequestMapping界面上的@Get

看看是否有效:

@RequestMapping(
        consumes = MimeTypeUtils.APPLICATION_JSON_VALUE,
        produces = MimeTypeUtils.APPLICATION_JSON_VALUE,
        method = RequestMethod.GET)
@ResponseBody
@ResponseStatus(HttpStatus.OK)
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Get {

    @AliasFor(annotation = RequestMapping.class, attribute = "value")
    String[] value() default {};
}

@Get(value = "/users")
public UserResponse retrieveUsers() {
    return new UserResponse();
}

您可能对GetJson项目中的spring-composed感兴趣。

请注意,@AliasFor仅在Spring 4.2中发布。它在早期版本中不可用。