Spring JSR-303 with form:errors tag

时间:2017-03-29 12:08:46

标签: java spring jsp spring-mvc

我正在尝试使用JSR-303验证并在jsp页面中显示结果。这是jsp页码代码,显示错误:

<c:set var="Error">
    <form:errors path="name"/>
</c:set>
...
<spring:transform value="${Error}"/>

在控制器中我有以下内容:

@PostMapping(params = "next")
public String next(@Valid @ModelAttribute(COMMAND_NAME) final ProjectNewDetailsCommand cmd,
                   final Errors errors,
                   final Model model,
                   final HttpServletRequest request) {

首先,适合我的解决方案是编写自定义Validator类:

@Override
public void validate(Object o, Errors errors) {
    errors.pushNestedPath("project");
    ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "error.project.creation.name.required");
    errors.popNestedPath();
}

在这种情况下,来自messages.properties的相应消息已应用并显示在UI上:

error.project.creation.name.required=The name must not be blank.

这是我使用JSR-303注释时的另一种情况:

public class Project {

    ...
    @Size(max = 100, message = "error.project.creation.size")
    private String name;

messages.properties中,密钥error.project.creation.size下方有消息,我还尝试使用密钥Size.command.project.name添加消息,如某些来源中所述。控制器中的Error对象也不为空并包含验证错误。但是当我使用JSR-303这种方法时,我收到了以下错误:

Caused by: javax.servlet.jsp.JspTagException: No message found under code 'Size' for locale 'en_US'.
    at org.springframework.web.servlet.tags.MessageTag.doEndTag(MessageTag.java:200)

这意味着由于某种原因Spring尝试应用Size错误代码而不是error.project.creation.sizeSize.command.project.name。任何想法为什么会发生这种情况以及如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

最后我能够找到问题的根源。在呈现提醒的代码中,有一个spring:message标记:

<spring:message code="${error.code}" arguments="${error.arguments}"/>

如果按以下方式工作:它会在codes类中查找Errors数组中的最后一个代码(请参阅DefaultMessageSourceResolvable.getCode方法),这就是为什么它找不到{{1消息并没有选择由hibernate验证器或自定义验证器创建的Size

此案例中的简单修复是添加defaultMessage属性:

text