У меня не отображаются ошибки, которые я вписал в BindResult.rejectValue(...)
после redirect
. Код сам рабочий и программа успешно принимает форму, успешно ее обрабатывает, но при redirect
на другую (в данном случае, прошлую) страницу данные об ошибках не сохраняются. Как это исправить?
Код thymeleaf:
<form th:action="@{/account/general/edit/name}" class="form-edit" method="post">
<div th:if="${#fields.hasErrors('customer.name')}" class="form-edit">
<span th:errors="*{customer.name}"></span>
</div>
<div>
<span>Имя</span>
<input type="text" th:value="${customer.name}" th:field="*{customer.name}">
</div>
<div th:if="${#fields.hasErrors('customer.surname')}" class="form-edit">
<span th:errors="*{customer.surname}"></span>
</div>
<div>
<span>Фамилия</span>
<input type="text" th:value="${customer.surname}" th:field="*{customer.surname}">
</div>
<input type="submit" value="Сохранить">
</form>
Java-контроллер для страницы выше:
@Controller
@RequestMapping("/account/general/edit")
public class GeneralInformationEditController {
@GetMapping
public ModelAndView GeneralInformationEditGet(){
ModelAndView modelAndView = new ModelAndView();
//некоторый код
Customer customer = generalService.findByEmail(email);
modelAndView.addObject("customer", customer);
modelAndView.setViewName("account/edit/general_information_edit");
return modelAndView;
}
}
Java-контроллер на которую переходит форма:
@Controller
@RequestMapping("/account/general/edit/name")
public class NameEdit {
@PostMapping
public ModelAndView NameEditPost(@ModelAttribute("customer") Customer customerForm, BindingResult bindingResult){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("redirect:/account/general/edit");
//checkers
if(customerForm.getName().length() > 18 || customerForm.getName().length() < 2){
//Недостаточно символов. Должно быть между 2 и 18
bindingResult.
rejectValue("name", "error.name",
"Неправильное количество символов. Количество букв должно быть от 2 до 18.");
}
//checkers
if(customerForm.getSurname().length() > 18 || customerForm.getSurname().length() < 2){
//Недостаточно символов. Должно быть между 2 и 18
bindingResult.
rejectValue("surname", "error.surname",
"Неправильное количество символов. Количество букв должно быть от 2 до 18.");
}
if(bindingResult.hasErrors()){
System.out.println("ошибки");
return modelAndView;
}
//некоторый код, если ошибок нет
return modelAndView;
}
}
Ответ нашел на данном сайте
Все достаточно просто. Нужно просто было добавить:
redirectAttributes.addFlashAttribute("org.springframework.validation.BindingResult.NAMEOFTHEATTRIBUTE", bindingResult);
if(bindingResult.hasErrors()){
redirectAttributes.getFlashAttributes().clear();
redirectAttributes.addFlashAttribute("org.springframework.validation.BindingResult.customer", bindingResult);
redirectAttributes.addFlashAttribute("customer", customerForm);
return modelAndView;
}
В GET-форме нужно изменить данную строку:
model.addAttribute("customer", customer);
на данную:
if(!model.containsAttribute("customer")){
model.addAttribute("customer", customer);
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Хочу посмотреть как работают и из чего состоят реальные проектыТо-есть меня интересует не именно исходники на гитхабе(там я всеравно ничего...
Дали задание написать консольное приложение, база студентов, не используя баз данных, а только объекты для храненияВ чем суть задания