Ожидается, что аргумент Errors/BindingResult будет объявлен сразу после атрибута модели, аргументов @RequestBody или @RequestPart

Я учу себя Spring, анализируя примеры приложений, а затем добавляя код здесь и там для проверки теорий, которые я разрабатываю во время вскрытия. Я получаю следующее сообщение об ошибке при тестировании кода, который я добавил в приложение Spring:

An Errors/BindingResult argument is expected to be declared immediately after the  
model attribute, the @RequestBody or the @RequestPart arguments to which they apply  

Метод, к которому относится сообщение об ошибке:

@RequestMapping(value = "/catowners", method = RequestMethod.GET)
public String findOwnersOfPetType(Integer typeID, BindingResult result, Map<String, Object> model) {
    // find owners of a specific type of pet
    typeID = 1;//this is just a placeholder
    Collection<Owner> results = this.clinicService.findOwnerByPetType(typeID);
    model.put("selections", results);
    return "owners/catowners";
}  

Это сообщение об ошибке было инициировано, когда я попытался загрузить шаблон url/catowners в веб-браузере. Я просмотрел эту страницу и эту публикацию, но объяснение не кажется ясным,

Может ли кто-нибудь показать мне, как исправить эту ошибку, а также объяснить, что это значит?

EDIT:
На основании ответа Biju Kunjummen я изменил синтаксис на следующее:

@RequestMapping(value = "/catowners", method = RequestMethod.GET)
public String findOwnersOfPetType(@Valid Integer typeID, BindingResult result, Map<String, Object> model)  

Я все равно получаю то же сообщение об ошибке. Я что-то не понимаю?

ВТОРОЙ РЕДАКТИРОВАНИЕ:

На основе комментария Sotirios я изменил код на следующее:

@RequestMapping(value = "/catowners", method = RequestMethod.GET)
public String findOwnersOfPetType(BindingResult result, Map<String, Object> model) {
    // find owners of a specific type of pet
    Integer typeID = 1;//this is just a placeholder
    Collection<Owner> results = this.clinicService.findOwnerByPetType(typeID);
    model.put("selections", results);
    return "owners/catowners";
 }

Я все равно получаю одно и то же сообщение об ошибке после того, как вы сказали eclipse, что... снова запустите на сервере.

Есть ли что-то, что я не понимаю?

Ответы

Ответ 1

Spring использует интерфейс с именем HandlerMethodArgumentResolver для разрешения параметра в методах обработчика и построения объекта для передачи в качестве аргумента.

Если он не находит его, он передает null (я должен это проверить).

BindingResult - это объект результата, который содержит ошибки, которые могут возникнуть при проверке @ModelAttribute, @Valid, @RequestBody или @RequestPart, поэтому вы можете использовать его только с параметрами, которые аннотируются как таковые, Для каждой из этих аннотаций есть HandlerMethodArgumentResolver.

EDIT (ответ на комментарий)

В вашем примере показано, что пользователь должен указать тип домашнего животного (как целое число). Я бы изменил метод на

@RequestMapping(value = "/catowners", method = RequestMethod.GET)
public String findOwnersOfPetType(@RequestParam("type") Integer typeID, Map<String, Object> model)

И вы сделаете свой запрос (в зависимости от вашей конфигурации) как

localhost:8080/yourcontext/catowners?type=1

Здесь тоже нечего проверять, поэтому вам не нужен или нужен BindingResult. Это не сработает, если вы все равно попытаетесь добавить его.

Ответ 2

Если у вас есть параметр типа BindingResult, по существу, он должен содержать любые ошибки при привязке параметров http-запроса к переменной, объявленной непосредственно перед параметром метода BindingResult.

Итак, все это приемлемо:

@RequestMapping(value = "/catowners", method = RequestMethod.GET)
public String findOwnersOfPetType(@Valid MyType type, BindingResult result, ...)


@RequestMapping(value = "/catowners", method = RequestMethod.GET)
public String findOwnersOfPetType(@ModelAttribute MyType type, BindingResult result, ...)

@RequestMapping(value = "/catowners", method = RequestMethod.GET)
public String findOwnersOfPetType(@RequestBody @Valid MyType type, BindingResult result, ...)