我正常使用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
无效。
我在这里做错了什么?是否可以使用自定义组合注释使控制器正常运行?
答案 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中发布。它在早期版本中不可用。