2012-08-04 84 views
5

在我的Spring MVC驗證中,我的錯誤消息順序隨機更改,我希望消息的順序與它們在頁面上顯示的順序相同。錯誤消息的順序不正確

我AccountForm.java類的樣子:

@NotNull(message = "Account name cannot be empty.") 
@Size(min=3, max=50, message="Account name must be between 3 and 50 characters long.") 
private String accountName; 

@NotNull(message = "Company name cannot be empty.") 
@Size(min=3, max=50, message="Company name must be between 3 and 50 characters long.") 
private String companyName; 

而且我也追加在我的控制器一些自定義錯誤:

public ModelAndView create(@Valid AccountForm accountForm, BindingResult bindingResult) { 

    ModelAndView mav = new ModelAndView("accounts/new"); 
    mav.addObject("errors", bindingResult.getAllErrors()); 
    mav.addObject("accountForm", accountForm); 

    if (!bindingResult.hasErrors()) { 
     if(accountService.findByAccountName(accountForm.getAccountName()) != null) { 
      bindingResult.addError(new ObjectError("accountName", "Account name is already is use")); 
     } 
     .. 
     .. 
    } 

    if(bindingResult.hasErrors() { 
     return mav; 
    } 

    .. 

當我打提交表單上,該消息的順序不斷變化。

 <#list errors as error> 
      <li>${error.defaultMessage}</li> 
     </#list> 

這個問題能解決:

我使用呈現在我看來,錯誤?

+1

在你接受的1800個問題中只有60%? :) Darn – Eugene 2012-08-04 09:52:58

回答

4

這是通過驗證組和Spring支持來實現的。您正在使用@Valid註解,但它應該是@Validated爲了使用驗證組:

public ModelAndView submitSearch(@Validated(value={OrderChecks.class}) @ModelAttribute("SearchStringBackingObject") final SearchStringBackingObject backingObject 

OrderChecks.class:

@GroupSequence(value={NotEmptyGroup.class, LengthCheckGroup.class, DiacriticeCheckGroup.class, EmailValidationGroup.class, EmailLengthValidationGroup.class, 
    Email3EntriesValidationGroup.class, EntityAlreadyExistsValidatorGroup.class, Default.class}) 
public interface OrderChecks {} 

和背面物體內部:

@NotBlank(groups=NotEmptyGroup.class) 
@Length(max=25, groups=LengthCheckGroup.class) 
@DiacriticeCheck(groups=DiacriticeCheckGroup.class) 
private String firstname=""; 

其中@GroupSequence中的每個條目都是一個接口。

編輯

所以,如果你想先驗證帳戶名稱,然後你爲它創建一個接口:

public interface AccountNameGroup{} 

那你這將是驗證組接口內第一個界面:

@GroupSequence(value={AccountNameGroup.class, the rest of groups}) 
public interface OrderOfGroups{} 

And of course inside the Controller you specify the @Validated annotation with the OrderOFGroups interface. 

這樣帳戶名將首先被驗證

+0

因此在我的情況下,我有帳戶名稱,公司名稱,電子郵件,密碼。我必須爲每個人創建一個組? – Blankman 2012-08-05 04:14:40

+0

@布蘭克曼 - 喲,喲必須。檢查我更新的答案。 – Eugene 2012-08-05 07:05:39

+1

爲了簡單點菜就是樣板代碼的配置的人,去java吧! :) – Blankman 2012-08-05 15:28:59

0

我也面臨同樣的問題,並嘗試了很多。我認爲現在在JSR-303中有這樣做的標準方法。
這可以通過使用groups(我個人不喜歡)或通過定義<form:error>來實現。

相關問題