2015-12-08 2 views
1

я правильно работаю Spring Controller, где у меня есть метод, отображенный в следующий образеSpring Controller: аннотации с комбинированным Spring аннотаций не работает

@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

Почему вы думаете, что ваш '@ Get' будет работать так? –

+0

Почему бы и нет? На самом деле он работает, но не правильно. По крайней мере, он возвращает код состояния, например. Я предполагаю, что когда я помещаю '' '@RequestMapping (value ="/users ")' '', он фактически переопределяет отображение в моей пользовательской аннотации, так как другая аннотация в '' '@ Get''' фактически работает. – vtor

+0

Вы пытались объединить @RequestMapping с одной аннотацией и посмотреть, устраняет ли это проблему? – gonzo

ответ

1

Я подозреваю, что @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 был выпущен только весной 4.2. Он недоступен в более ранних версиях.

2

Вы перезаписываете аннотацию @RequestMapping, которую вы указали в своей аннотации @Get. Поэтому он определяет только часть отображения запроса, оставив все остальные свойства по умолчанию.

Смежные вопросы