2012-08-04 9 views
5

Nella mia convalida MVC di primavera, l'ordine dei miei messaggi di errore cambia casualmente, vorrei che i messaggi fossero nello stesso ordine in cui appaiono nella pagina.I messaggi di errore non sono nell'ordine corretto

classe

mio AccountForm.java assomiglia:

@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; 

E ho anche accoda alcuni errori personalizzati in mio controller:

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

    .. 

Quando mi ha colpito presentare sul modulo, l'ordine dei messaggi continua a cambiare.

rendo gli errori nel mio punto di vista utilizzando:

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

Questo può essere fisso?

+1

delle 1800 domande che hai accettato solo il 60%? :) Darn – Eugene

risposta

4

Questo risultato è ottenuto tramite convalida Gruppi e supporti di sostegno primavera. Si utilizza @Valid annotazione, ma si sarebbe dovuto @Validated al fine di utilizzare la convalida Gruppi:

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 {} 

E all'interno dell'oggetto supporto:

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

dove ciascuna delle voci in @GroupSequence è un'interfaccia.

EDIT

Quindi, se si desidera che il nome dell'account da convalidare prima, quindi si crea un'interfaccia per esso:

public interface AccountNameGroup{} 

poi dentro l'interfaccia di convalida gruppo questo sta per essere la prima interfaccia:

@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. 

In questo modo il nome account verrà convalidato prima

+0

quindi nel mio caso ho nome account, nome dell'azienda, email, password. Devo creare un gruppo per ognuno? – Blankman

+0

@Blankman: sì, devi farlo. Controlla la mia risposta aggiornata. – Eugene

+1

uomo che assegna il codice boilerplate per l'ordinamento semplice, vai java! :) – Blankman

0

Ho anche affrontato lo stesso problema e provato un sacco. Penso che ora ci sia un modo standard per farlo in JSR-303.
Questo può essere ottenuto utilizzando groups (che personalmente non mi piace) o definendo <form:error> è la sequenza desiderata.

Problemi correlati