Mam komponent bean, w którym definiuję wiele adnotacji sprawdzania poprawności dla każdego pola, np.Jak wykonać walidację sprawdzania poprawności Hibernuj na pierwszym naruszeniu pola?
@NotEmpty
@Pattern(regexp="(\\-?\\d)+")
@Min(value=1)
String myField;
ja spotkałem
dwa
jeden problem, że nie mogę rozwiązać w łatwy sposób.
-
Kolejność sprawdzania określonych adnotacji dla każdego pola jest losowa, tj. Nie występuje w kolejności, w której są zdefiniowane adnotacje. Uważam, że @GroupSequence nie pomoże, ponieważ definiuje tylko sekwencję sprawdzania poprawności grupy, a nie sekwencję adnotacji.Jak poprawnie skomentowano @Tom, naruszenia są zgłaszane jako ustawione, co oznacza, że nie ma odwzorowania 1: 1 między kolejnością wykonywania adnotacji a zgłoszonymi naruszeniami. - Chcę unieważnić tylko jedną regułę dla każdego pola, tzn. Jeśli nie pasuje do wzorca, nie należy sprawdzać, czy wartość jest równa> = 1. Obecnie, jeśli ustawiona jest mojaField na "abc", będzie raportować zarówno @Pattern, jak i @ Min. Naruszenia. Ustawienie właściwości failFast walidatora na true nie pomaga, ponieważ używam tej samej instancji sprawdzania poprawności do sprawdzania poprawności wszystkich pól w moim komponencie bean i przestanie sprawdzać poprawność innych pól, gdy tylko napotkane zostanie pierwsze naruszenie całego komponentu bean.
Edytuj. Próbowałem zaimplementować niestandardowe ograniczenie złożenia za pomocą @ReportAsSingleViolation. Problem polega na tym, że zgłosi tę samą wiadomość dla wszystkich naruszeń związanych ze składem. To nie jest to, czego potrzebuję.
Sugestie, proszę?
Czy jesteś pewien, że kolejność sprawdzania jest losowa? O ile pamiętam, walidator zwraca 'Set' z' ConstraintViolation'. Ten zestaw nie ma określonej kolejności. Tak więc nie ma żadnego związku między poleceniem walidacji a kolejnością zgłaszanych naruszeń. – Tom
@ Tom OK, może są wykonywane w zdefiniowanej kolejności. Ale masz rację, chyba że Set interfece jest wspierany przez jedną z uporządkowanych zestawów implementacji, nie może być mapowania 1: 1 między kolejnością wykonywania i kolejnością zgłaszanych naruszeń. Co oznacza, że to, czego tak naprawdę szukam, jest odpowiedzią na moje drugie pytanie. – davidgale
Można to sprawdzić za pomocą debuggera i sprawdzić, która implementacja "zestawu" jest tam używana. Może to być 'LinkedHashSet', ale zakładam, że to po prostu normalny' HashSet'. Cóż, w drugiej części: obecnie widzę tylko jedno brudne rozwiązanie: napisz swój własny walidator dla każdego pola. Mam jednak nadzieję, że ktoś inny (który ma więcej doświadczenia z Hibernate Validator) ma o wiele lepszy pomysł :). – Tom