我在spring mvc项目中使用javax bean验证。 这是我的示例代码。
User.java: -
@NotEmpty(message = "{error.user.username.empty}")
private String userName;
UserController.java: -
public String handleSubmission(@ModelAttribute("user")@Valid User user, BindingResult errors) {
....
}
messages_en.properties: -
error.user.username.empty=Username can not be empty
NotEmpty.user.userName=Username can not be empty
每当'userName'字段为空时,验证将按预期失败,但应用程序会抛出异常,
Caused by: javax.servlet.jsp.JspTagException: No message found under code 'NotEmpty' for locale 'en_US'.
在日志中,我可以看到,
Field error in object 'user' on field 'userName': rejected value []; codes [NotEmpty.user.userName,NotEmpty.userName,NotEmpty.java.lang.String,NotEmpty];
arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [user.userName,userName]; arguments []; default message [userName]]; default message [Username cannot be empty]
验证注释中使用的消息密钥是'error.user.username.empty',该密钥在messages_en.properties中定义,但应用程序仅查看 关键'NotEmpty'。即使添加键'NotEmpty.user.userName'也无济于事。 只有当我将'NotEmpty'键添加到属性文件时,异常才会消失,例如
NotEmpty=Username can not be empty
MessageSource配置如下,
@Configuration
@EnableWebMvc
public class AppConfig extends WebMvcConfigurerAdapter {
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasename("messages");
return messageSource;
}
}
显示错误消息的JSP代码是
user.jsp: -
<spring:hasBindErrors name="user">
<ul>
<li> <span class="error">Please fix all errors and try again.</span></li>
<c:forEach var="error" items="${errors.allErrors}">
<li> <span class="error"><spring:message code="${error.code}"/></span></li>
</c:forEach>
</ul>
</spring:hasBindErrors>
更新: -
即使使用 - <form:errors path="userName"/>.
我刚刚在JSP中显示了错误代码和默认错误消息,其中包含以下代码,
<spring:hasBindErrors name="user">
<c:forEach var="error" items="${errors.allErrors}">
<span class="error">${error.code} - ${error.defaultMessage}</span>
</c:forEach>
</spring:hasBindErrors>
输出是,
NotEmpty - Username cannot be empty
这意味着从ValidationMessages.properties文件中正确读取了defaultMessage'Username不能为空'。因为那是那里定义的消息。但错误代码仍然是'NotEmpty'。 总而言之,
<form:errors path="*" />
,则为bean'user'显示所有错误消息,除了javax bean验证消息。<form:errors path="userName" />
不显示任何内容。 答案 0 :(得分:1)
在类路径中创建一个名为ValidationMessages.properties
的文件,并在那里添加验证错误消息。
更新自定义Validator
以使用已注册的MessageSource
:
@Configuration
@EnableWebMvc
public class AppConfig extends WebMvcConfigurerAdapter {
@Override
public Validator getValidator() {
return validator();
}
@Bean
public LocalValidatorFactoryBean validator() {
LocalValidatorFactoryBean bean = new LocalValidatorFactoryBean();
bean.setValidationMessageSource(messageSource());
return bean;
}
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasename("messages");
return messageSource;
}
}