2016-01-29 37 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