我正在尝试使用 JSR-303
验证并在 jsp
页面中显示它的结果。这是显示错误的 jsp
页面代码片段:
<c:set var="Error">
<form:errors path="name"/>
</c:set>
...
<spring:transform value="${Error}"/>
在 Controller 中我有以下内容:
@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
Controller 中的对象也不为空并且包含验证错误。但是,当我将此方法与 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.size
或 Size.command.project.name
.知道为什么会发生这种情况以及如何解决这个问题吗?
最佳答案
终于找到了问题的根源。在渲染警报的代码中,有一个 spring:message
标签:
<spring:message code="${error.code}" arguments="${error.arguments}"/>
If 以下列方式工作:它从 Errors
类中的 codes
数组中查找最后的代码(参见 DefaultMessageSourceResolvable.getCode 方法),这就是它不能的原因找到 Size
消息,但没有找到由 hibernate validator 或自定义 validator 创建的 defaultMessage
。
在这种情况下,简单的解决方法是添加 text
属性:
<spring:message code="${error.code}" arguments="${error.arguments}" text="${error.defaultMessage}"/>
关于java - 带有 :errors tag 形式的 Spring JSR-303,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43093120/