2012-08-04 16 views
5

मेरे वसंत एमवीसी सत्यापन में, मेरे त्रुटि संदेशों का क्रम यादृच्छिक रूप से बदलता है, मैं चाहता हूं कि संदेश पृष्ठ पर दिखाई देने के क्रम में उसी क्रम में हों।त्रुटि संदेश सही क्रम में नहीं हैं

मेरे 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% स्वीकार किए हैं? :) डार – Eugene

उत्तर

4

यह प्रमाणीकरण समूहों और वसंत के माध्यम से हासिल किया जाता है। आप @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

+0

@ ब्लैंकमैन - हाँ, आपको करना है। मेरा अद्यतन उत्तर देखें। – Eugene

+1

आदमी जो सरल क्रम के लिए बॉयलरप्लेट कोड आवंटित करता है, जावा जाओ! :) – Blankman

0

मुझे भी एक ही समस्या का सामना करना पड़ा और बहुत कोशिश की। मुझे लगता है कि जेएसआर -303 में ऐसा करने का अब मानक तरीका है।
यह groups (जिसे मैं व्यक्तिगत रूप से पसंद नहीं करता) या <form:error> परिभाषित करके वांछित अनुक्रम का उपयोग करके हासिल किया जा सकता है।

संबंधित मुद्दे