2012-04-30 9 views
6

Mam klasę komponentów bean z wieloma (niestandardowymi) ograniczeniami wewnętrznymi i jednym ograniczeniem na poziomie klasy. Chciałbym sprawdzić wewnętrzne ograniczenia przed ograniczeniem na poziomie klasy. Kod wygląda następująco:Sprawdzanie poprawności Java Bean: GroupSequence z ograniczeniem klasy Klasa

@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 jest tylko pusta interfejs leżącego gdzieś).

Jednak, gdy próbuję to uruchomić, ograniczenie na poziomie klasy nie zostanie w ogóle sprawdzone. Kiedy próbuję zdefiniować GroupSequence jak

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

(z Outer jest przypadkowa Interface), otrzymuję wyjątek:

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

Czy S/O wiedzieć, jak upewnić się, że klasa na poziomie ograniczenie jest sprawdzane po wewnętrznych? (!. To nie wydaje się być domyślnym miałem problemów z losowych to pojawiały się po jakimś czasie)

Odpowiedz

10

Spróbuj tego:

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

Według spec NewSlotBean tylko Stand dla domyślnej grupy. Patrz również punkt 3.4.3 spec Bean Validation:

Ponieważ sekwencje nie mogą mieć wzajemnie od siebie zależnych, przy użyciu domyślnych w deklaracja sekwencji nie jest rozwiązaniem. Ograniczenia hostowane na klasy A i przynależności do grupy Default (domyślnie lub pośrednio) niejawnie należą do grupy A.

Sekwencja zdefiniowane w klasie A (czyli redefinicji domyślnych grup dla klasy) musi zawiera grupę A. Innymi słowy, domyślne ograniczenia hostowane w klasie muszą być częścią definicji sekwencji. Jeśli grupa @GroupSequence ponownie definiuje grupę domyślną dla klasy A, to nie zawiera grupy A, wyjątek GroupDefinitionException podnosi się, gdy Deklaracja ograniczenia i proces sprawdzania poprawności klasy jest sprawdzana pod kątem lub gdy żądane są jej metadane.

+0

Tylko poprawa propozycja na doskonałą odpowiedź: prawdopodobnie lepsze pogrupowanie walidacje na odwrót: '@GroupSequence ({NewSlotBean.class, ClassLevel.class}) @TotalBeanValid (grupy) = ClassLevel.class 'w klasie' NewSlotBean', a następnie usuń grupę walidacji 'InnerGroup' i przypisania do grupy pól. Walidacje pól są automatycznie przypisywane do domyślnej grupy sprawdzania poprawności. Mniej kodu, czystsze. – jannis

Powiązane problemy