2016-01-29 32 views
1

我在spring mvc项目中使用了javax bean验证。 这是我的示例代码。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 

每当 '用户名' 字段为空验证失败如预期的那样,但是应用引发异常,

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 

这意味着defaultMessage“用户名不能为空'正在从ValidationMessages.properties文件中正确读取。因为那是在那里定义的消息。但是错误代码仍然是'NotEmpty'。 因此,在总结,

  1. 如果我试图通过对如图JSP代码上面,我得到一个异常遍历所有错误显示消息。
  2. 如果我使用<form:errors path="*" />所有错误消息都显示为bean'user'EXCEPT javax bean验证消息。
  3. 使用<form:errors path="userName" />什么都不显示。
+1

哪些属性的文件?添加你的配置和jsp。 –

+0

谢谢M. Deinum。用配置和jsp代码更新了问题。我已经在messages_en.properties文件中定义了消息。 – ivish

+0

使用''而不是你现在拥有的。 '$ {error.code}'只会解析一个代码。无论是使用'$ {error}'还是只使用''标签而不是现在拥有的标签。 –

回答

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; 
    } 
} 
+0

Thanks Ali。我错过了提及它,但我也尝试了这种方法。我在'src/main/resources'文件夹中的一个名为ValidationMessages.properties的文件旁边的messages_en.properties文件中定义了所需的消息代码。它不起作用与以前相同的例外 – ivish

+0

查看最新..也许有帮助 –

+0

试过你建议。但它没有解决问题:-( – ivish