2016-08-11 12 views
1

У меня есть весна RestController с конечной точкой, использующей JSON. Он преобразует JSON в объект, и проверяет поля (с помощью проверки боба):Spring RestController - вызов метода перехвата

@RequestMapping(method = RequestMethod.POST, consumes = "application/json") 
public ResponseEntity<?> myMethod(@Valid @RequestBody MyEntity e) { 
    ... 
} 

Я хотел бы, чтобы перехватить вызов этого метода только после преобразования и проверки имеет место, чтобы иметь доступ к MyEntity и, возможно, прекратить выполнение.

Использование перехватчиков Spring, я могу только перехватить запрос до того, как он достигнет метода - так что у меня нет доступа к проверенному компоненту. Я могу использовать Spring AOP и добавить pointcut, но есть ли способ прервать выполнение красиво – в идеале, не бросая исключение?

Эта функциональность находится за пределами бизнес-логики этого метода и является временным –, поэтому я хочу ее разделить.

ответ

0

Возможным решением является создание прокси-сервера bean между прокси-объектом Spring и объектом вашего исходного класса. Для этого вам необходимо:

  1. Внесите свои собственные BeanPostProcessor.
  2. Весна вызовет его метод postProcessBeforeInitialization() сразу после того, как он создал экземпляр объекта вашего класса, но перед его упаковкой и инициализацией. В этом методе определите, какие компоненты должны быть снабжены вашей функциональностью. Это часто делается с помощью ваших пользовательских аннотаций о методах или классах.
  3. Создайте свой собственный прокси для bean-компонентов с шага 2. Вы можете использовать cglib или что-то более современное для этого. Ваш прокси сделает все необходимые вам проверки, а затем вызовет метод родителя, если все в порядке, или просто молча вернуться из метода, если что-то не так.
  4. Верните свой прокси от postProcessBeforeInitialization(), он даст указание использовать Spring вместо исходного компонента.

В результате Spring создаст прокси-сервер вашего прокси-сервера, а не исходного объекта. Когда запрос поступит, Spring проведет проверку и отправит его на ваш прокси. Ваш прокси сделает все ваши пользовательские проверки и решит, отправлять ли его дальше в исходный класс или немедленно вернуться.

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