Нет редиректа после ошибки валидации Spring boot

@Controller
@RequestMapping("/user/")
public class UserControl {

    @PostMapping("/add/")
    public String dpPostAdd(@Valid @ModelAttribute("user") User user, RedirectAttributes RedirectAttr, BindingResult binding) {

        if (!binding.hasErrors()) {
            UserService userService = new UserService();
            userService.addUser(user);
        } else {
            RedirectAttr.addFlashAttribute("org.springframework.validation.BindingResult.register", binding);
            RedirectAttr.addFlashAttribute("user", user);
        }
        return "redirect:/";
    }

    @GetMapping(path = "/del/")
    public String doGetDel (@RequestParam(name = "login") String login, Model model ) {
            UserService userService = new UserService();
            userService.delUser(login);
            model.addAttribute("userList", userService.getUserList());
        return "redirect:/";
    }
}

При таком коде прослеживается странное поведение, а именно, в случае ошибки валидации код метода doPostAdd не выполняется! На стороне клиента просто получаем 400 ошибку и остаемся на том же пути. Хотя в фоне где-то выполняется код главной страницы, потому как мы в логе получаем test3, вывод этого сообщения установлен аккурат пере return контроллера главной страницы.

Лог spring

2023-01-04T20:17:20.091+07:00  WARN 60168 --- [nio-8080-exec-9] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 2 errors<EOL>Field error in object 'user' on field 'login': rejected value [Фыв]; codes [Pattern.user.login,Pattern.login,Pattern.java.lang.String,Pattern]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [user.login,login]; arguments []; default message [login],[Ljakarta.validation.constraints.Pattern$Flag;@5880016c,[A-z0-9]+]; default message [Можно использовать цифры, английские буквы и знак "_"!]<EOL>Field error in object 'user' on field 'password': rejected value [фыв]; codes [Pattern.user.password,Pattern.password,Pattern.java.lang.String,Pattern]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [user.password,password]; arguments []; default message [password],[Ljakarta.validation.constraints.Pattern$Flag;@5880016c,[A-z0-9]+]; default message [Можно использовать цифры, английские буквы и знак "_"!]]
Файл успешно прочитан!
test3

Почему не выполняется код, если валидация не прошла?


Ответы (1 шт):

Автор решения: Tip.the.besT

Решение проблемы:

public String dpPostAdd(@Valid @ModelAttribute("user") User user, BindingResult binding, RedirectAttributes RedirectAttr) {
...
}

BindingResult должен быть раньше других параметров.

→ Ссылка