2012-04-30 7 views
6

Ho una classe bean con più vincoli interni (personalizzati) e un vincolo a livello di classe. Mi piacerebbe convalidare i vincoli interni prima del vincolo a livello di classe. Il codice è simile al seguente:Convalida Java Bean: GroupSequence con un vincolo a livello di classe

@GroupSequence({ Inner.class, NewSlotBean.class }) 
@TotalBeanValid(groups = NewSlotBean.class) 
public class NewSlotBean { 

    @DayMonthYearString(groups = Inner.class) 
    private String slotDay; 

    @TimeString(groups = Inner.class) 
    private String slotBegin; 

    @LengthString(groups = Inner.class) 
    private String slotLength; 
} 

(Inner è solo un'interfaccia vuota in giro da qualche parte).

Tuttavia, quando provo a eseguire questo, il vincolo a livello di classe non viene convalidato affatto. Quando cerco di definire il GroupSequence come

@GroupSequence({ Inner.class, Outer.class }) 

(con Outer essere un interfaccia casuale), ottengo l'eccezione:

javax.validation.GroupDefinitionException: ...*.beans.NewSlotBean must be part of the redefined default group sequence. 

Fa s/o sapere come fare in modo che il livello di classe il vincolo è convalidato dopo quelli interiori? (!. Questo sembra non essere il default Ho avuto problemi casuali con esso popping up dopo un po ')

risposta

10

Prova questo:

@GroupSequence({ Inner.class, NewSlotBean.class }) 
@TotalBeanValid(groups = Default.class) 
public class NewSlotBean { 

    @DayMonthYearString(groups = Inner.class) 
    private String slotDay; 

    @TimeString(groups = Inner.class) 
    private String slotBegin; 

    @LengthString(groups = Inner.class) 
    private String slotLength; 
} 

Secondo le specifiche NewSlotBean è solo uno stand- in per il gruppo predefinito. Vedere anche la sezione 3.4.3 della specifica Bean Validation:

Poiché sequenze non possono avere dipendenze circolari, utilizzando predefinito in dichiarazione di una sequenza non è un'opzione. Vincoli ospitati su una classe A e appartenente al gruppo predefinito (di default o esplicitamente) implicitamente appartengono al gruppo A.

una sequenza definita su una classe A (cioè ridefinire i gruppi predefiniti per la classe) deve contenere il gruppo A. In altre parole, i vincoli predefiniti ospitati su una classe devono far parte della definizione della sequenza. Se un @GroupSequence ridefinisce il gruppo Default per una classe A non contiene il gruppo A, viene sollevata un'eccezione GroupDefinitionException quando processo di convalida e convalida la classe è convalidata o quando vengono richiesti i relativi metadati.

+0

Solo un suggerimento per migliorare una risposta eccellente: è probabilmente meglio per raggruppare le convalide il contrario: '@GroupSequence ({NewSlotBean.class, ClassLevel.class}) @TotalBeanValid (gruppi = ClassLevel.class) 'sulla classe' NewSlotBean' e quindi rimuovere il gruppo di convalida 'InnerGroup' e le assegnazioni del gruppo a livello di campo - le convalide dei campi vengono assegnate automaticamente al gruppo di convalida predefinito. Meno codice, più pulito. – jannis

Problemi correlati