Отображение ошибок с помощью BindingResult в Thymeleaf форме при redirect

160
22 июня 2021, 20:20

У меня не отображаются ошибки, которые я вписал в 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;
    }
}
Answer 1

Ответ нашел на данном сайте

Все достаточно просто. Нужно просто было добавить: 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);
}
READ ALSO
Spring Framework реальные приложения

Spring Framework реальные приложения

Хочу посмотреть как работают и из чего состоят реальные проектыТо-есть меня интересует не именно исходники на гитхабе(там я всеравно ничего...

109
Установка WebLogic

Установка WebLogic

Пытаюсь установить сервер WebLogic

115
Не всегда срабатывает scrollTo

Не всегда срабатывает scrollTo

Если запускаю метод softReset содержащий scrollTo(0,0)

100
Аналог базы данных в объектах

Аналог базы данных в объектах

Дали задание написать консольное приложение, база студентов, не используя баз данных, а только объекты для храненияВ чем суть задания

99