Java 表单验证错误消息未按预期显示

Java 表单验证错误消息未按预期显示,java,spring,forms,validation,spring-boot,Java,Spring,Forms,Validation,Spring Boot,请求实体: may not be empty may not be empty public class RequestModel { private Long requestId; @NotNull @NotBlank private String selectedDate; private RequestStatus requestStatus; @NotNull @NotBlank private String de

请求实体:

may not be empty may not be empty
public class RequestModel {

    private Long requestId;

    @NotNull
    @NotBlank
    private String selectedDate;

    private RequestStatus requestStatus;

    @NotNull
    @NotBlank
    private String description;

    private Boolean hasForced;

    public String getSelectedDate() {
        return selectedDate;
    }

    public void setSelectedDate(String selectedDate) {
        this.selectedDate = selectedDate;
    }

    public Long getRequestId() {
        return requestId;
    }

    public void setRequestId(Long requestId) {
        this.requestId = requestId;
    }

    public RequestStatus getRequestStatus() {
        return requestStatus;
    }

    public void setRequestStatus(RequestStatus requestStatus) {
        this.requestStatus = requestStatus;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public Boolean getHasForced() {
        return hasForced;
    }

    public void setHasForced(Boolean hasForced) {
        this.hasForced = hasForced;
    }
}
@RequestMapping(value = "/save", method = RequestMethod.POST)
String saveRequest(Principal principal, @Valid @ModelAttribute(value = "requestModel") RequestModel requestModel, BindingResult bindingResult, RedirectAttributes redirectAttributes) {

        if (bindingResult.hasErrors()) {
            // log.info("There are binding errors.");
            return "send";
        }
    ...
    }
控制器:

may not be empty may not be empty
public class RequestModel {

    private Long requestId;

    @NotNull
    @NotBlank
    private String selectedDate;

    private RequestStatus requestStatus;

    @NotNull
    @NotBlank
    private String description;

    private Boolean hasForced;

    public String getSelectedDate() {
        return selectedDate;
    }

    public void setSelectedDate(String selectedDate) {
        this.selectedDate = selectedDate;
    }

    public Long getRequestId() {
        return requestId;
    }

    public void setRequestId(Long requestId) {
        this.requestId = requestId;
    }

    public RequestStatus getRequestStatus() {
        return requestStatus;
    }

    public void setRequestStatus(RequestStatus requestStatus) {
        this.requestStatus = requestStatus;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public Boolean getHasForced() {
        return hasForced;
    }

    public void setHasForced(Boolean hasForced) {
        this.hasForced = hasForced;
    }
}
@RequestMapping(value = "/save", method = RequestMethod.POST)
String saveRequest(Principal principal, @Valid @ModelAttribute(value = "requestModel") RequestModel requestModel, BindingResult bindingResult, RedirectAttributes redirectAttributes) {

        if (bindingResult.hasErrors()) {
            // log.info("There are binding errors.");
            return "send";
        }
    ...
    }
完整的HTML表单:

may not be empty may not be empty
public class RequestModel {

    private Long requestId;

    @NotNull
    @NotBlank
    private String selectedDate;

    private RequestStatus requestStatus;

    @NotNull
    @NotBlank
    private String description;

    private Boolean hasForced;

    public String getSelectedDate() {
        return selectedDate;
    }

    public void setSelectedDate(String selectedDate) {
        this.selectedDate = selectedDate;
    }

    public Long getRequestId() {
        return requestId;
    }

    public void setRequestId(Long requestId) {
        this.requestId = requestId;
    }

    public RequestStatus getRequestStatus() {
        return requestStatus;
    }

    public void setRequestStatus(RequestStatus requestStatus) {
        this.requestStatus = requestStatus;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public Boolean getHasForced() {
        return hasForced;
    }

    public void setHasForced(Boolean hasForced) {
        this.hasForced = hasForced;
    }
}
@RequestMapping(value = "/save", method = RequestMethod.POST)
String saveRequest(Principal principal, @Valid @ModelAttribute(value = "requestModel") RequestModel requestModel, BindingResult bindingResult, RedirectAttributes redirectAttributes) {

        if (bindingResult.hasErrors()) {
            // log.info("There are binding errors.");
            return "send";
        }
    ...
    }


您必须为您的请求提供理由。 您必须选择一个日期。

这里发生了什么?

这些消息来自验证注释默认值。要设置您自己的,您需要像下面这样提供它们,或者您可以使用MessageSource从属性文件进行更改

<form role="form" th:action="@{/request/save}" th:object="${requestModel}" method="post">
    <input type="checkbox" th:field="*{hasForced}" th:checked="${false}" style="display: none;"/>         
    <p><input id="description" class="descriptionField" type="text" th:field="*{description}"
              placeholder="Please provide a reason for your request"
              style="width: 500px; border-radius: 4px; padding: 11px 11px 11px 11px;"/></p>
    <input id="embeddedDateField" class="dateField" placeholder="YYYY-MM-DD" type="text" th:field="*{selectedDate}" readonly
           style="border-radius: 4px; background: #eefdff; text-align: center;"/><br>
    <input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}"/>
    <div style="margin: 5px; width: 200px;"><input type="submit" value="Submit Request"
                                                   style="display: block;"></div>
    <td th:if="${#fields.hasErrors('description')}" th:errors="*{description}" class="red">You must provide a reason for your request.</td>
    <td th:if="${#fields.hasErrors('selectedDate')}" th:errors="*{selectedDate}" class="ed">You must select a date.</td>
</form>

我用字体标记将
td
本身围成红色:
日期错误