2011-12-06 13 views
7

Chcę umieścić zestaw standardowych wiązań (takich jak nie pusty łańcuch alfanumeryczny o długości od 3 do 240 znaków) na polach (String w tym przypadku) i chcesz wiedzieć, czy istnieje sposób na zastąpienie niektórych tego ograniczenia w kodzie modelu. Czy to będzie nadrzędne, czy po prostu sprawdzanie poprawności dwa razy dla nadpisanej adnotacji?JSR 303 Ograniczenie niestandardowe Zastępowanie

powinno być coś takiego

@AlphanumericString 
@Size(min=100, max=150) //override standart values from AlphanumericString annotation 

dzięki Ci odpowiada

ok, odpowiedzieć sobie. istnieje @OverridesParameter wich pomaga przypisanie zagnieżdżonych parametr Adnotacja

@Numerical 
@Size //arbitrary parameter values 
@ConstraintValidator(FrenchZipcodeValidator.class) 
@Documented 
@Target({ANNOTATION_TYPE, METHOD, FIELD}) 
@Retention(RUNTIME) 
public @interface FrenchZipCode { 
    String message() default "Wrong zipcode"; 
    String[] groups() default {}; 

    @OverridesParameters({ 
     @OverridesParameter(constraint=Size.class, parameter="min") 
     @OverridesParameter(constraint=Size.class, parameter="max") }) 
    int size() default 5; 

    @OverridesParameter(constraint=Size.class, parameter="message") 
    String sizeMessage() default "{error.zipcode.size}"; 

    @OverridesParameter(constraint=Numerical.class, parameter="message") 
    String numericalMessage() default "{error.zipcode.numerical}"; 
} 

source

Odpowiedz

5

Jest to miły pytanie. JSR 303 Bean Validation specification opisuje procedurę sprawdzania poprawności w sekcji 3.5.

dla danej grupy, aby potwierdzić, oczekuje się, że rutynowe sprawdzanie poprawności stosowane na danej instancji fasoli, aby wykonać następujące ograniczenie walidacji w przypadkowej kolejności:

  • dla wszystkich pól osiągalnych, wykonać wszystko sprawdzanie poprawności na poziomie pola (w tym wyrażone w nadklasach) pasujące do docelowej grupy , chyba że dane ograniczenie sprawdzające zostało już przetworzone podczas tej procedury sprawdzania poprawności dla danej ścieżki nawigacji (patrz sekcja 3.5.1) jako część poprzedniego mecz grupowy.

...

Procedura walidacji obiekt opisany jest jako taki. Do każdego zgłoszenia więzów:

  • określić dla deklaracji ograniczeń, odpowiednie ConstraintValidator do użycia (patrz punkt 3.5.3).
  • wykonać IsValid operacji (od realizacji walidacji ograniczenie) na odpowiednich danych (patrz punkt 2.4)
  • jeśli isValid zwraca true, przejdź do kolejnego ograniczenia,
  • jeśli isValid zwraca fałsz, zapełnia dostawcy Bean Validation Obiekt (obiekty) restrykcyjne zgodnie z regułami zdefiniowanymi w Rozdziale 2.4 i dołącza te obiekty do listy naruszeń ograniczeń.

W twoim przypadku, mamy do czynienia z walidacji prosty String polu, gdzie grupa docelowa jest Default. Masz dwa ograniczenia sprawdzania poprawności (@AlphanumericString i @Size), które zgodnie z dokumentacją będą sprawdzane/przetwarzane osobno w określonej kolejności.

Więc, aby odpowiedzieć na twoje pytanie. Nie, nie będzie żadnego nadpisania zastosowanego do twojego @AlphanumericString, gdy dodatkowo użyjesz @Size.Aby móc osiągnąć to, co myślę, że próbują zrobić, można utworzyć kompozycję wiązania gdzie overridde atrybutów składających adnotacji tak:

@Pattern(regexp="[a-zA-Z]*") 
@Size 
@Constraint(validatedBy = AlphanumericStringValidator.class) 
@Documented 
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER }) 
@Retention(RUNTIME) 
public @interface AlphanumericString { 
    // ... 
    @OverridesAttribute(constraint=Size.class, name="min") 
    int min() default 3 
    @OverridesAttribute(constraint=Size.class, name="max") 
    int max() default 230;  
    // ... 
} 

i używać go tak:

@AlphanumericString(min = 100, max = 150) 
+0

Dzięki, już to wymyśliłeś, spróbujesz użyć tej metody, czy możesz zaproponować mi sposób na przyspieszenie sprawdzania poprawności, inny niż tworzenie fabryki walidatorów tylko raz na aplikację, dzielenie walidacji na grupy i zamawianie ich z szybszego na wolniejszy czas przetwarzania? – Pilgrim

Powiązane problemy