Overenie fazule v Jersey

1. Prehľad

V tomto tutoriále sa pozrieme na Bean Validation pomocou open source framework Jersey.

Ako sme už videli v predchádzajúcich článkoch, Jersey je rámec otvoreného zdroja pre vývoj webových služieb RESTful. Viac podrobností o Jersey môžeme získať v našom úvode o tom, ako vytvoriť API s Jersey a Spring.

2. Validácia fazule v Jersey

Validácia je proces overovania, či sa niektoré údaje riadia jedným alebo viacerými vopred definovanými obmedzeniami. Vo väčšine aplikácií je to samozrejme veľmi častý prípad použitia.

Rámec Java Bean Validation (JSR-380) sa stal de facto štandardom pre manipuláciu s týmto druhom operácií v Jave. Ak si chcete zopakovať základné informácie o overovaní Java Bean, pozrite si náš predchádzajúci návod.

Jersey obsahuje rozširujúci modul na podporu Bean Validation. Aby sme mohli túto funkciu využiť v našej aplikácii, musíme si ju najskôr nakonfigurovať. V ďalšej časti uvidíme, ako nakonfigurovať našu aplikáciu.

3. Nastavenie aplikácie

Teraz teda poďme na jednoduchý príklad Fruit API z vynikajúceho článku podpory Jersey MVC.

3.1. Maven závislosti

Najskôr pridajme závislosť Bean Validation na našu pom.xml:

 org.glassfish.jersey.ext validácia dres-bean 2.27 

Najnovšiu verziu môžeme získať z Maven Central.

3.2. Konfigurácia servera

V Jersey bežne registrujeme funkciu rozšírenia, ktorú chceme použiť v našej triede konfigurácie vlastných zdrojov.

Pre rozšírenie validácie fazule však nie je potrebné túto registráciu robiť. Našťastie je to jedna z mála rozšírení, ktoré Jerseyský rámec registruje automaticky.

Na záver odošleme klientovi chyby overenia pridáme vlastnosť servera do našej vlastnej konfigurácie prostriedkov:

public ViewApplicationConfig () {packages ("com.baeldung.jersey.server"); vlastnosť (ServerProperties.BV_SEND_ERROR_IN_RESPONSE, pravda); } 

4. Validácia metód zdroja JAX-RS

V tejto časti vysvetlíme dva rôzne spôsoby overovania vstupných parametrov pomocou anotácií obmedzení:

  • Používanie zabudovaných obmedzení API Bean Validation
  • Vytvorenie vlastného obmedzenia a overovača

4.1. Používanie vstavaných anotácií obmedzení

Začnime pohľadom na zabudované anotácie obmedzení:

@POST @Path ("/ create") @Consumes (MediaType.APPLICATION_FORM_URLENCODED) public void createFruit (@NotNull (message = "Názov ovocia nesmie byť null") @FormParam ("name") Názov reťazca, @NotNull (message = „Farba ovocia nesmie byť nulová“) @FormParam („farba“) Farba reťazca) {Ovocie ovocie = nové Ovocie (názov, farba); SimpleStorageService.storeFruit (ovocie); } 

V tomto príklade vytvoríme nový Ovocie pomocou dvoch parametrov formulára, názov a farba. Používame @NotNull anotácia, ktorá je už súčasťou API Bean Validation.

To ukladá jednoduché, nie nulové obmedzenie našich parametrov formulára. V prípade, že jeden z parametrov je nulový, správa deklarovaná v anotácii bude vrátená.

Prirodzene to preukážeme testom jednotky:

@Test public void givenCreateFruit_whenFormContainsNullParam_thenResponseCodeIsBadRequest () {Formulár formulára = nový Form (); form.param ("meno", "jablko"); form.param ("farba", null); Odozva response = target ("ovocie / vytvorenie"). Request (MediaType.APPLICATION_FORM_URLENCODED) .post (Entity.form (form)); assertEquals ("Http odpoveď by mala byť 400", 400, response.getStatus ()); assertThat (response.readEntity (String.class), containsString ("Farba ovocia nesmie byť nulová")); } 

Vo vyššie uvedenom príklade používame JerseyTest trieda podpory na otestovanie nášho zdroja ovocia. Pošleme žiadosť POST s nulovou hodnotou farba a skontrolujte, či odpoveď obsahuje očakávanú správu.

Zoznam zabudovaných obmedzení pre overenie nájdete v dokumentoch.

4.2. Definovanie anotácie vlastného obmedzenia

Niekedy musíme zaviesť zložitejšie obmedzenia. Môžeme to urobiť definovaním našej vlastnej anotácie.

Pomocou nášho jednoduchého príkladu Fruit API si predstavme, že musíme overiť, či má všetko ovocie platné sériové číslo:

@PUT @Path ("/ update") @Consumes ("application / x-www-form-urlencoded") public void updateFruit (@SerialNumber @FormParam ("serial") reťazec) {// ...} 

V tomto príklade parameter sériový musí vyhovovať obmedzeniam definovaným v @Sériové číslo, ktoré definujeme ďalej.

Najskôr definujeme anotáciu obmedzenia:

@Retention (RetentionPolicy.RUNTIME) @Constraint (validatedBy = {SerialNumber.Validator.class}) public @interface SerialNumber {String message () default "Sériové číslo ovocia nie je platné"; Skupiny [] skupiny () predvolené {}; Trieda [] užitočné zaťaženie () predvolené {}; } 

Ďalej definujeme triedu validátora SerialNumber.Validator:

public class Validator implementuje ConstraintValidator {@Override public void initialize (SerialNumber serial) {} @Override public boolean isValid (String serial, ConstraintValidatorContext constraintValidatorContext) {String serialNumRegex = "^ \ d {3} - \ d {3} - \ d \ d {4} $ "; vrátiť Pattern.matches (serialNumRegex, serial); }} 

Kľúčovým bodom je Validátor trieda musí implementovať ConstraintValidator kde T je typ hodnoty, ktorú chceme overiť, v našom prípade a String .

Nakoniec potom implementujeme našu vlastnú logiku overovania v je platné metóda.

5. Validácia zdrojov

Rozhranie Bean Validation API nám ďalej umožňuje overiť objekty pomocou súboru @ Platné anotácia.

V nasledujúcej časti vysvetlíme dva rôzne spôsoby overovania tried zdrojov pomocou tejto anotácie:

  • Najskôr požiadajte o overenie prostriedkov
  • Po druhé, overenie prostriedkov odpovede

Začnime pridaním @ Min anotácia k našej Ovocie objekt:

@XmlRootElement verejná trieda Ovocie {@Min (hodnota = 10, message = "Hmotnosť ovocia musí byť 10 alebo vyššia") súkromná celočíselná váha; // ...} 

5.1. Vyžiadajte si overenie zdrojov

Najskôr povolíme overenie pomocou @ Platné v našom FruitResource trieda:

@POST @Path ("/ create") @Consumes ("application / json") public void createFruit (@Valid Fruit fruit) {SimpleStorageService.storeFruit (ovocie); } 

Vo vyššie uvedenom príklade Ak sa pokúsime vytvoriť ovocie s hmotnosťou menšou ako 10, zobrazí sa nám chyba overenia.

5.2. Validácia zdroja odpovede

Rovnako tak v nasledujúcom príklade uvidíme, ako overiť prostriedok odozvy:

@GET @Valid @Produces ("application / json") @Path ("/ search / {name}") public Fruit findFruitByName (@PathParam ("name") Názov reťazca) {návrat SimpleStorageService.findByName (meno); }

Všimnite si, ako používame to isté @ Platné anotácia. Tentokrát ho však používame na úrovni zdrojovej metódy, aby sme sa uistili, že odpoveď je platná.

6. Obsluha vlastných výnimiek

V tejto poslednej časti sa v krátkosti pozrieme na to, ako vytvoriť vlastný obslužný program výnimiek. Je to užitočné, keď chceme vrátiť vlastnú odpoveď, ak porušíme konkrétne obmedzenie.

Začnime definovaním našich FruitExceptionMapper:

verejná trieda FruitExceptionMapper implementuje ExceptionMapper {@Override public Response toResponse (výnimka ConstraintViolationException) {návrat Response.status (Response.Status.BAD_REQUEST) .entity (prepareMessage (výnimka)). typ ("text / plain") .build (); } private String prepareMessage (ConstraintViolationException exception) {StringBuilder message = new StringBuilder (); pre (ConstraintViolation cv: exception.getConstraintViolations ()) {message.append (cv.getPropertyPath () + "" + cv.getMessage () + "\ n"); } vrátiť správu.toString (); }}

Najskôr definujeme vlastného poskytovateľa mapovania výnimiek. Za týmto účelom implementujeme ExceptionMapper rozhranie pomocou a ConstraintViolationException.

Preto uvidíme, že keď sa vyvolá táto výnimka do odpovede bude vyvolaná metóda našej vlastnej inštancie mapovača výnimiek.

V tomto jednoduchom príklade tiež prechádzame všetkými porušeniami a pripájame každú vlastnosť a správu, ktorá sa má odoslať späť v odpovedi.

Ďalej, aby sme mohli použiť náš vlastný mapovač výnimiek, musíme zaregistrovať nášho poskytovateľa:

@ Override chránená aplikácia configure () {ViewApplicationConfig config = nový ViewApplicationConfig (); config.register (FruitExceptionMapper.class); návratová konfigurácia; }

Nakoniec pridáme koncový bod na vrátenie neplatného Ovocie ukážka obsluhy výnimky v akcii:

@GET @Produces (MediaType.TEXT_HTML) @Path ("/ exception") @Valid public Fruit exception () {Fruit fruit = new Fruit (); ovocie.setName ("a"); fruit.setColour ("b"); vrátiť ovocie; } 

7. Záver

Ak to zhrnieme, v tomto tutoriáli sme preskúmali rozšírenie API Jersey Bean Validation.

Najskôr sme začali predstavením toho, ako sa dá API Bean Validation použiť v Jersey. Pozreli sme sa tiež na to, ako nakonfigurovať ukážkovú webovú aplikáciu.

Nakoniec sme sa pozreli na niekoľko spôsobov, ako vykonať overenie pomocou Jersey, a ako napísať vlastný obslužný program výnimiek.

Celý zdrojový kód článku je ako vždy k dispozícii na GitHub.


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