Ожидается, что аргумент 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, ...)