Результат привязки/Ошибки не объявляются сразу после присвоения модели, но нет проблем, почему?

#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).