首页 > 解决方案 > 字段已正确验证,但视图中未显示错误

问题描述

我在视图(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>

我究竟做错了什么?我已经在 Web 上的几个不同页面上看到了这个问题的解决方案,构造:${#fields.hasErrors()}随处使用,每个人都在使用addFlashAttribute,但在我的情况下它不起作用。

标签: javaspringspring-bootvalidationthymeleaf

解决方案


推荐阅读