Obmedzenia metód s overením Bean 2.0

1. Prehľad

V tomto článku si ukážeme, ako definovať a overiť obmedzenia metód pomocou Bean Validation 2.0 (JSR-380).

V predchádzajúcom článku sme diskutovali o JSR-380 s jeho vstavanými anotáciami a o tom, ako implementovať overenie vlastnosti.

Tu sa zameriame na rôzne typy obmedzení metód, ako napríklad:

  • obmedzenia jedného parametra
  • krížový parameter
  • obmedzenia návratu

Ďalej sa pozrieme na to, ako overiť obmedzenia ručne a automaticky pomocou nástroja Spring Validator.

Pre nasledujúce príklady potrebujeme úplne rovnaké závislosti ako v Java Bean Validation Basics.

2. Deklarácia obmedzení metódy

Začať, najskôr si povieme, ako deklarovať obmedzenia parametrov metódy a návratové hodnoty metód.

Ako už bolo spomenuté, môžeme použiť anotácie z javax.validation.constraints, ale môžeme určiť aj vlastné obmedzenia (napr. pre vlastné obmedzenia alebo obmedzenia medzi parametrami).

2.1. Obmedzenia jedného parametra

Definovanie obmedzení pre jednotlivé parametre je jednoduché. Jednoducho musíme ku každému parametru podľa potreby pridať anotácie:

public void createReservation (@NotNull @Future LocalDate begin, @Min (1) int duration, @NotNull Customer customer) {// ...}

Rovnaký prístup môžeme použiť aj pre konštruktérov:

public class Customer {public Customer (@Size (min = 5, max = 200) @NotNull String firstName, @Size (min = 5, max = 200) @NotNull String lastName) {this.firstName = firstName; this.lastName = priezvisko; } // vlastnosti, getre a setre}

2.2. Použitie obmedzení medzi parametrami

V niektorých prípadoch možno budeme musieť overiť viac hodnôt naraz, napr. Dve číselné hodnoty, ktoré sú jedno väčšie ako druhé.

Pre tieto scenáre môžeme definovať vlastné obmedzenia medzi parametrami, ktoré môžu závisieť od dvoch alebo viacerých parametrov.

Obmedzenia medzi parametrami možno považovať za validáciu metódy ekvivalentnú obmedzeniam na úrovni triedy. Oba by sme mohli použiť na implementáciu validácie na základe niekoľkých vlastností.

Zamyslime sa nad jednoduchým príkladom: variáciou createReservation () metóda z predchádzajúcej časti trvá dva parametre typu LocalDate: dátum začatia a dátum ukončenia.

Preto sa tým chceme ubezpečiť začať je v budúcnosti, a koniec je po začať. Na rozdiel od predchádzajúceho príkladu to nemôžeme definovať pomocou obmedzení s jedným parametrom.

Namiesto toho potrebujeme obmedzenie viacerých parametrov.

Na rozdiel od obmedzení s jedným parametrom obmedzenia krížových parametrov sú deklarované v metóde alebo konštruktore:

@ConsistentDateParameters public void createReservation (LocalDate begin, LocalDate end, zákazník zákazníka) {// ...}

2.3. Vytváranie obmedzení medzi parametrami

Implementovať @ConsistentDateParameters obmedzenia, potrebujeme dva kroky.

Najprv musíme definovať anotáciu obmedzenia:

@Constraint (validatedBy = ConsistentDateParameterValidator.class) @Target ({METHOD, CONSTRUCTOR}) @Retention (RUNTIME) @Documented public @interface ConsistentDateParameters {String message () default „Dátum ukončenia musí byť po dátume začiatku a oba musia byť v budúcnosti "; Skupiny [] skupiny () predvolené {}; Trieda [] užitočné zaťaženie () predvolené {}; }

Tu sú tieto tri vlastnosti povinné pre anotácie obmedzení:

  • správa - vráti predvolený kľúč na vytváranie chybových správ, čo nám umožňuje používať interpoláciu správ
  • skupiny - umožňuje nám určiť overovacie skupiny pre naše obmedzenia
  • užitočné zaťaženie - môžu byť použité klientmi rozhrania Bean Validation API na priradenie vlastných objektov užitočného zaťaženia k obmedzeniam

Podrobnosti o tom, ako definovať vlastné obmedzenie, nájdete v oficiálnej dokumentácii.

Potom môžeme definovať triedu validátora:

@SupportedValidationTarget (ValidationTarget.PARAMETERS) verejná trieda ConsistentDateParameterValidator implementuje ConstraintValidator {@Override public boolean isValid (Object [] hodnota, ConstraintValidatorContext kontext) {if (hodnota [0] == null || hodnota [1] = ; } if (! (hodnota [0] instanceof LocalDate) ||! (hodnota [1] instanceof LocalDate)) {hodiť novú IllegalArgumentException ("Neplatný podpis metódy, očakávané dva parametre typu LocalDate."); } návratová ((LocalDate) hodnota [0]). isAfter (LocalDate.now ()) && ((LocalDate) hodnota [0]). isBefore ((LocalDate) hodnota [1]); }}

Ako vidíme, je platné() metóda obsahuje skutočnú logiku validácie. Najskôr sa uistíme, že dostaneme dva parametre typu LocalDate. Potom skontrolujeme, či sú obe v budúcnosti a koniec je po začať.

Je tiež dôležité uvedomiť si, že @SupportedValidationTarget (ValidationTarget.PARAMETRE) anotácia k ConsistentDateParameterValidator trieda je povinná. Dôvod je ten, že @ConsistentDateParameter je nastavený na úrovni metódy, ale obmedzenia sa budú vzťahovať na parametre metódy (a nie na návratovú hodnotu metódy, ako si ukážeme v nasledujúcej časti).

Poznámka: Odporúča sa vziať do úvahy špecifikácia overenia fazule nulový-hodnoty platné. Ak nulový nie je platná hodnota, @NotNull- namiesto toho by sa mala použiť poznámka.

2.4. Obmedzenia návratovej hodnoty

Niekedy budeme musieť overiť objekt tak, ako je vrátený metódou. Na tento účel môžeme použiť obmedzenia návratovej hodnoty.

Nasledujúci príklad používa integrované obmedzenia:

public class ReservationManagement {@NotNull @Size (min = 1) public List getAllCustomers () {return null; }}

Pre getAllCustomers (), platia nasledujúce obmedzenia:

  • Po prvé, vrátený zoznam nesmie byť nulový a musí mať aspoň jeden záznam
  • Zoznam ďalej nesmie obsahovať nulový záznamy

2.5. Vlastné obmedzenia návratovej hodnoty

V niektorých prípadoch možno budeme musieť overiť aj zložité objekty:

public class ReservationManagement {@ValidReservation public Reservation getReservationsById (int id) {return null; }}

V tomto príklade vrátené Rezervácia objekt musí vyhovovať obmedzeniam definovaným v @ValidReservation, ktoré definujeme ďalej.

Opäť najskôr musíme definovať anotáciu obmedzenia:

@Constraint (validatedBy = ValidReservationValidator.class) @Target ({METHOD, CONSTRUCTOR}) @Retention (RUNTIME) @Documented public @interface ValidReservation {String message () default "Dátum ukončenia musí byť po dátume začatia" + "a oba musia byť v budúcnosti musí byť číslo miestnosti väčšie ako 0 "; Skupiny [] skupiny () predvolené {}; Trieda [] užitočné zaťaženie () predvolené {}; }

Potom definujeme triedu validátora:

public class ValidReservationValidator implements ConstraintValidator {@Override public boolean isValid (Reservation reservation, ConstraintValidatorContext context) {if (reservation == null) {return true; } if (! (reservation instanceof Reservation)) {{throw new IllegalArgumentException ("Illegal method signature," + "expect parameter of type Reservation."); } if (reservation.getBegin () == null || reservation.getEnd () == null || reservation.getCustomer () == null) {return false; } return (reservation.getBegin (). isAfter (LocalDate.now ()) && reservation.getBegin (). isBefore (reservation.getEnd ()) && reservation.getRoom ()> 0); }}

2.6. Návratová hodnota v konštruktoroch

Ako sme si zadefinovali SPÔSOB a KONŠTRUKTOR ako cieľ v rámci našej ValidReservation rozhranie predtým, môžeme tiež anotovať konštruktora Rezervácia na overenie vytvorených inštancií:

public class Reservation {@ValidReservation public Reservation (LocalDate begin, LocalDate end, Customer customer, int room) {this.begin = begin; this.end = koniec; this.customer = customer; this.room = izba; } // vlastnosti, getre a setre}

2.7. Kaskádové overenie

Nakoniec nám rozhranie Bean Validation API umožňuje nielen overovať jednotlivé objekty, ale aj objektové grafy pomocou takzvanej kaskádovej validácie.

Preto môžeme použiť @ Platné pre kaskádovú validáciu, ak chceme overiť zložité objekty. Toto funguje pre parametre metódy aj pre návratové hodnoty.

Predpokladajme, že máme a Zákazník trieda s obmedzeniami vlastností:

verejná trieda Zákazník {@Size (min = 5, max = 200) súkromný reťazec firstName; @ Size (min = 5, max = 200) private String lastName; // konštruktor, getri a nastavovatelia}

A Rezervácia trieda môže mať a Zákazník vlastnosti, ako aj ďalšie vlastnosti s obmedzeniami:

public class Reservation {@Valid private Customer customer; @Positive private int room; // dalšie vlastnosti, konštruktor, getre a setre}

Ak teraz odkazujeme Rezervácia ako parameter metódy, môžeme vynútiť rekurzívnu validáciu všetkých vlastností:

public void createNewCustomer (@Valid Rezervačná rezervácia) {// ...}

Ako vidíme, používame @ Platné na dvoch miestach:

  • Na rezervácia-parameter: spustí validáciu Rezervácia-objekt, kedy createNewCustomer () sa volá
  • Pretože tu máme graf vnorených objektov, musíme pridať aj a @ Platné na zákazník-attribute: tým spustí validáciu tejto vnorenej vlastnosti

Toto funguje aj pre metódy vracajúce objekt typu Rezervácia:

@ Platná verejná rezervácia getReservationById (int id) {return null; }

3. Validácia obmedzení metódy

Po vyhlásení obmedzení v predchádzajúcej časti môžeme teraz pristúpiť k skutočnej validácii týchto obmedzení. Na to máme viac prístupov.

3.1. Automatické overenie pomocou pružiny

Spring Validation poskytuje integráciu s Hibernate Validator.

Poznámka: Spring Validation je založená na AOP a používa Spring AOP ako predvolenú implementáciu. Preto validácia funguje iba pre metódy, ale nie pre konštruktory.

Ak teraz chceme, aby jar automaticky potvrdila naše obmedzenia, musíme urobiť dve veci:

Najskôr musíme fazuľa, ktorá sa má validovať, anotovať pomocou @Overené:

@Validated public class ReservationManagement {public void createReservation (@NotNull @Future LocalDate begin, @Min (1) int duration, @NotNull Customer customer) {// ...} @NotNull @Size (min = 1) public List getAllCustomers ( ) {return null; }}

Po druhé, musíme poskytnúť a MethodValidationPostProcessor fazuľa:

@Configuration @ComponentScan ({"org.baeldung.javaxval.methodvalidation.model"}) verejná trieda MethodValidationConfig {@Bean public MethodValidationPostProcessor methodValidationPostProcessor () {return new MethodValidationPostProcessor (); }}

Kontajner teraz odhodí a javax.validation.ConstraintViolationException, ak dôjde k porušeniu obmedzenia.

Ak používame Spring Boot, kontajner zaregistruje a MethodValidationPostProcessor fazuľa pre nás pokiaľ hibernácia-validátor je v triede.

3.2. Automatická validácia pomocou CDI (JSR-365)

Od verzie 1.1 Bean Validation pracuje s CDI (Contexts and Dependency Injection pre Jakarta EE).

Ak je naša aplikácia spustená v kontajneri Jakarta EE, kontajner bude v čase vyvolania automaticky overovať obmedzenia metód.

3.3. Programové overenie

Pre manuálna validácia metódy v samostatnej aplikácii Java, môžeme použiť javax.validation.executable.ExecutableValidator rozhranie.

Inštanciu môžeme načítať pomocou nasledujúceho kódu:

ValidatorFactory factory = Validation.buildDefaultValidatorFactory (); ExecutableValidator executableValidator = factory.getValidator (). ForExecutables ();

ExecutableValidator ponúka štyri spôsoby:

  • validateParameters () a validateReturnValue () na validáciu metódy
  • validateConstructorParameters () a validateConstructorReturnValue () na overenie konštruktora

Overenie parametrov našej prvej metódy createReservation () bude vyzerať takto:

Objekt ReservationManagement = nový ReservationManagement (); Metóda method = ReservationManagement.class .getMethod ("createReservation", LocalDate.class, int.class, Customer.class); Object [] parameterValues ​​= {LocalDate.now (), 0, null}; Nastaviť priestupky = executableValidator.validateParameters (objekt, metóda, hodnoty parametra);

Poznámka: Oficiálna dokumentácia neodporúča volať toto rozhranie priamo z kódu aplikácie, ale používať ho pomocou technológie zachytávania metód, ako je AOP alebo proxy.

V prípade, že vás zaujíma, ako používať ExecutableValidator si môžete pozrieť oficiálnu dokumentáciu.

4. Záver

V tomto výučbe sme sa rýchlo pozreli na to, ako používať obmedzenia metód s programom Hibernate Validator, taktiež sme diskutovali o niektorých nových funkciách JSR-380.

Najprv sme diskutovali o tom, ako deklarovať rôzne typy obmedzení:

  • Obmedzenia jednotlivých parametrov
  • Krížový parameter
  • Obmedzenia návratovej hodnoty

Pozreli sme sa tiež na to, ako overiť obmedzenia ručne a automaticky pomocou nástroja Spring Validator.

Celý zdrojový kód príkladov je ako vždy k dispozícii na serveri GitHub.


$config[zx-auto] not found$config[zx-overlay] not found