Поле правильно проверено, но ошибка не отображается в представлении

#java #spring #spring-boot #validation #thymeleaf

#java #весна #весенняя загрузка #проверка #thymeleaf

Вопрос:

У меня проблема с отображением ошибки в представлении (html-страница).

Форма выглядит следующим образом (для наглядности показано только одно поле):

 <form action="#" th:action="@{addinvoice}" th:object="${invoicedata}" method="post">
    <ul class="form-style-1">
        <li>
            <label>Data odbioru<span class="required">*</span></label>
            <input type="date" th:field="*{receptionDate}" id="receptionDate">
            <span th:if="${#fields.hasErrors('receptionDate')}" th:errors="*{receptionDate}">Error.</span>
        </li>
 

Тогда у меня есть пользовательский javax Validator :

 @Component
public class InvoiceFormValidator implements Validator {

    @Override
    public boolean supports(Class<?> clazz) {
        return InvoiceData.class.equals(clazz);
    }

    @Override
    public void validate(Object target, Errors errors) {
        ValidationUtils.rejectIfEmpty(errors, "receptionDate", "Reception date is empty!");
        InvoiceData invoicedata = (InvoiceData) target;
        if (invoicedata.getReceptionDate() == null) {
            errors.rejectValue("receptionDate", "Reception date cannot be empty!");
        }
    }
}
 

Проверка удваивается, потому что я хотел быть на 100% уверенным, что она проверяется правильно.

Теперь для Controller части это выглядит так (остальная часть кода удалена для ясности)

 @RequestMapping(value = "/addinvoice", method = RequestMethod.POST, produces = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
    public String addInvoice(@CurrentUser Contractor contractor, @ModelAttribute @Validated InvoiceData invoicedata, BindingResult result, Model model, RedirectAttributes attr) {
        if (result.hasErrors()) {
            logger.error("BINDING RESULT ERROR: "   result.getAllErrors().toString());
            logger.error("ERROR: "   result.getFieldError("receptionDate").getCode());
            attr.addFlashAttribute("org.springframework.validation.BindingResult.invoicedata", result);
            attr.addFlashAttribute("invoicedata", invoicedata);
            model.addAttribute("invoicedata", invoicedata);
            model.addAttribute("bindingResult", result);
            return "add";
 

Теперь, когда я отправляю форму без receptionDate , я получаю красивую строку из Logger:

 ERROR: Reception date is empty!
 

Таким образом, оно проверено правильно.

Но я перепробовал много-много вещей, и я даже не могу приблизиться, чтобы показать строку:

 <span th:if="${#fields.hasErrors('receptionDate')}" th:errors="*{receptionDate}">Error.</span>
 

Что я делаю не так? Я видел решения для этого на нескольких разных страницах в Интернете, конструкция: ${#fields.hasErrors()} используется везде, все используют addFlashAttribute , и в моем случае она не работает.

Комментарии:

1. Единственное, что вам нужно сделать, это return "add"; из if блока. все остальное уже является частью модели. Таким образом, в основном удалите добавление объектов к атрибутам Model и flash.

2. @M.Deinum — все, что я получил, это: java.lang. Исключение IllegalStateException: ни BindingResult, ни простой целевой объект для имени компонента ‘invoicedata’ не доступны в качестве атрибута запроса

3. Вы делаете return "add"; or return "redirect:add"? As that would make a huge difference. Also try @ModelAttribute(«invoicedata»)` вместо just @ModelAttribute . Если вы компилируете без имен аргументов метода, привязка автоматически не обнаружит имя атрибута.

4. @M.Deinum Я сделал так, как вы предложили, и теперь валидатор перестал проверять мои входные данные…

5. Вы должны оставить @Validated , я не предлагал это удалять.