Нет редиректа после ошибки валидации 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 должен быть раньше других параметров.