2014-12-23 20 views
8

Sto utilizzando la molla 4.1, hibernate validator 5.1.3 per il mio progetto. Ho cercato di far funzionare GroupSequence negli ultimi 2 giorni. Ho rinviato il documento di convalida, i blog e alcune domande pubblicate su StackOverflow.Sequenza di gruppo di convalida del bean non funzionante

Si prega di consultare la classe di seguito. Quando rimuovo GroupSequence e i gruppi dalle annotazioni, tutti i messaggi di convalida vengono visualizzati insieme, cioè tutti i controlli sul nome e altri campi vengono attivati ​​insieme. Diciamo per nome campo - Voglio @NotBlank e @Size per essere convalidati prima, quindi il nome deve essere abbinato al Pattern e alla fine dovrebbe essere controllato per @UniqueName a causa delle chiamate al database.

Per questo, ho creato il GroupSequence, come suggerito nei documenti e nelle risposte. Ma quando vengono lanciate le convalide, solo @NotBlank e @Size vengono licenziati per nome. Quando rimuovo il valore dei gruppi dalle annotazioni rimanenti, iniziano a funzionare ma vengono visualizzati tutti i messaggi di errore contemporaneamente, che non desidero.

Desidero che l'annotazione specificata con i gruppi First.class sia attivata prima delle convalide di Second.class. Non capisco perché le convalide specificate con i gruppi non vengano licenziate.

Qualcuno può guidarmi per favore.


@GroupSequence({MyForm.class, OrderedChecks.class}) 
public class MyForm { 

    @NotBlank 
    @Size(min = 2, max = 40) 
    @Pattern(regexp = "^[\\p{Alnum} ]+$", groups = First.class) 
    @UniqueName(groups = Second.class)//Custom validation 
    private String name; 

    @NotBlank 
    @Size(min = 2, max = 40) 
    private String url; 

    @NotBlank 
    @Size(max = 100) 
    private String imagePath; 

    //Custom Validation 
    @CheckContent(acceptedType = <someString>, allowedSize=<someval>, dimensions=<someval> groups = Second.class) 
    private MultipartFile image 

... 
} 

@GroupSequence(value = {Default.class, First.class, Second.class}) 
public interface OrderedChecks {} 

@Controller 
@RequestMapping(value = "/myForm") 
public class MyFormController { 

    @RequestMapping(method = POST) 
    public String completeSignUp(@Valid @ModelAttribute("myForm") final MyForm myForm, 
          BindingResult result, RedirectAttributes redirectAttributes, Model model) { 

     if(result.hasErrors()) { 
      model.addAttribute(companyDetailsForm); 
      //ERROR_VIEW="myForm"; 
      return ERROR_VIEW; 
     } 
     // Doing something else. 
     return <success view>; 
    } 
} 
+0

Qualcuno ha qualche idea sulla risoluzione o su cosa potrei fare male? – jay28

+0

È possibile aggiornare la domanda con il codice in cui la convalida non funziona come previsto (ad esempio il metodo del controller)? – Khalid

+0

@Khalid ha aggiunto il codice del controller, funziona ma non come mi aspetto. Dovrò usare un hack per farlo funzionare, cosa che ho in mente ma sto cercando qualcosa disponibile in mvc di primavera piuttosto che inserire il mio hack. Dovrò mettere questi controlli nella mia annotazione personalizzata, ma anche in quel caso non so se posso cambiare il messaggio di errore per un campo, come il nome che ha quattro annotazioni, in base alla condizione fallita. Ho definito i messaggi di errore in un file di proprietà. – jay28

risposta

5

di @Validated invece di @Valid Usa primavera. Questo ti permetterà di specificare il gruppo e controllare la sequenza.

cambiare il metodo di controllo per:

@RequestMapping(method = POST) 
public String completeSignUp(@Validated(OrderedChecks.class) @ModelAttribute("myForm") final MyForm myForm, 
         BindingResult result, RedirectAttributes redirectAttributes, Model model) { 
... 
} 

Si noti che non è necessario @GroupSequence({MyForm.class, OrderedChecks.class}) in cima MyForm fagioli.

+0

L'ho provato, ma non ha funzionato l'ultima volta. Farò di nuovo una prova. – jay28

+0

come suggerito, ho apportato le modifiche e non funziona. Le convalide appartenenti a un gruppo non vengono licenziate. – jay28

+0

Sta funzionando per me. Assicurati che il valore possa effettivamente attivare i vincoli '@ Pattern' e' @ UniqueName'. Se sei sicuro, attiva la registrazione debug di Spring e cerca eventuali suggerimenti. – Khalid

Problemi correlati