Как использовать @Valid с параметрами @RequestBody Spring MVC? - PullRequest
19 голосов
/ 25 мая 2011

У меня проблема с использованием @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 для управления подключением контроллеров, согласования контента и т. Д.

Ответы [ 2 ]

9 голосов
/ 13 июня 2011

Вы используете Spring 3.1? Это недавно добавленная функция в версии Spring 3.1. См. Проверка правильности аргументов метода @RequestBody

2 голосов
/ 18 октября 2011

Это проблема весной 3.0, и она исправлена ​​в 3,1 М2.

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

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

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

...