Подтвердить что ты не робот

Как использовать @Valid с параметрами Spring MVC @RequestBody?

У меня возникла проблема с использованием @Valid для параметра для метода обработчика на моем @Controller. Мой код выглядит следующим образом:

@RequestMapping(value=BIBBLE_BOBBLE_URI_PATTERN + "/widgets", method=RequestMethod.POST)
@ResponseBody
@ResponseStatus(HttpStatus.CREATED)
public Widget saveNewWidget(
        @PathVariable final String username,
        @PathVariable final String bibbleBobbleName,
        @Valid @RequestBody final Widget widget,
        final BindingResult results,
        final HttpServletRequest request,
        final HttpServletResponse response)

где Widget - класс для одного из моих объектов домена. Я использую аннотацию @RequestBody, чтобы указать, что полезная нагрузка запроса соответствует Widget (в моих тестах запросы JSON, хотя Джексон находится в моем пути к классам, поэтому я также могу использовать XML).

Как вы можете видеть, параметр BindingResult следует непосредственно после параметра Widget, но я получаю следующую ошибку:

java.lang.IllegalStateException: Errors/BindingResult argument declared without preceding model attribute. Check your handler method signature!

Как применить аннотацию @Valid к параметру @RequestBody, а затем получить результаты?

P.S. Я использую annotation-driven для обработки проводки контроллеров, ведения контента и т.д.

4b9b3361

Ответ 2

Это проблема в spring 3.0, и она исправлена ​​в 3.1 M2.

https://jira.springsource.org/browse/SPR-6709

Если вы используете spring 3.0, на основе некоторых потоков и обширного чтения, вот лучший подход для этой проблемы. Аспектно-ориентированный подход, чтобы мы могли отказаться, когда вы обновляете его до версии spring, которая устраняет эту проблему.

Аспект, который перехватывает вызовы методу, который использует аннотацию @RequestMapping, и для каждого параметра, который имеет @Valid аннотацию на нем, вызывает соответствующий валидатор в аспекте.