我正在尝试使用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.size
或Size.command.project.name
。任何想法为什么会发生这种情况以及如何解决这个问题?
答案 0 :(得分:1)
最后我能够找到问题的根源。在呈现提醒的代码中,有一个spring:message
标记:
<spring:message code="${error.code}" arguments="${error.arguments}"/>
如果按以下方式工作:它会在codes
类中查找Errors
数组中的最后一个代码(请参阅DefaultMessageSourceResolvable.getCode方法),这就是为什么它找不到{{1消息并没有选择由hibernate验证器或自定义验证器创建的Size
。
此案例中的简单修复是添加defaultMessage
属性:
text