#spring #spring-boot #validation #spring-mvc #data-binding
Вопрос:
Я читаю некоторый устаревший код в своей команде и обнаружил, что некоторые методы обработчика не имеют BindingResult
/ Errors
объявлены сразу после атрибута модели, но код работает хорошо без каких-либо проблем. Это противоречит моему предыдущему пониманию SpringMVC по этой теме.
Например, один метод обработчика выглядит следующим образом
@RequestMapping(value = "/search")
public String initateSearchData(HttpServletResponse response, HttpSession session, @ModelAttribute("searchData") SearchData searchData, Model model, Errors errors).
Может ли кто-нибудь сказать мне, почему в этом случае не отображается ошибка «Ожидается, что аргумент Errors/BindingResult будет объявлен сразу после атрибута модели»?
Комментарии:
1. Я сомневаюсь, что это метод обработчика, но скорее метод, вызываемый из другого метода обработчика, и аргументы передаются. Следовательно, обработчик не встречался в том смысле, что он вызывается через
RequestMappingHandlerAdapter
.2. Привет, Дейнум, спасибо за ответ. Этот метод имеет @RequestMapping(значение = «/xxx») поверх него. Я думаю, что это метод обработчика. Я только что обновил тему.
Ответ №1:
В документации Spring говорится: Параметры ошибок или BindingResult должны следовать за объектом модели, который немедленно привязывается, поскольку сигнатура метода может содержать более одного объекта модели, и Spring создаст отдельный экземпляр BindingResult для каждого из них. Ниже приведен код, объясняющий сценарий
Проблема:
@Controller
public class UserController {
@RequestMapping(value = "addUser")
public String addUser(@ModelAttribute("userForm") UserForm userForm,
ModelMap map, BindingResult results) {
if (results.hasErrors()) {
return "add_user_form";
}
return "add_user_success";
}
//...
}
Приведенный выше код дает java.lang.Исключение IllegalStateException: Ошибки/аргумент BindingResult, объявленный без предшествующего атрибута модели. Проверьте подпись метода обработчика.
Решение:
@RequestMapping(value = "addUser")
public String addUser(@ModelAttribute("userForm") UserForm userForm,
BindingResult results, ModelMap map)
Всякий раз, когда вы хотите определить объект BindingResult в своем методе контроллера, объявляйте его сразу после атрибута модели (@ModelAttribute).