javax bean验证无法解析消息代码

时间:2016-01-29 13:09:06

标签: java spring validation spring-mvc

我在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'。 总而言之,

  1. 如果我试图通过迭代所有错误来显示消息,如上面的JSP代码所示,我得到一个例外。
  2. 如果我使用<form:errors path="*" />,则为bean'user'显示所有错误消息,除了javax bean验证消息。
  3. 使用<form:errors path="userName" />不显示任何内容。

1 个答案:

答案 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;
    }
}