Provjera graha u Jerseyu

1. Pregled

U ovom uputstvu ćemo pogledati provjeru valjanosti graha pomoću open source okvira Jersey.

Kao što smo već vidjeli u prethodnim člancima, Jersey je okvir otvorenog koda za razvoj RESTful web usluga. Više detalja o Jerseyu možemo dobiti u našem uvodu o tome kako stvoriti API s Jerseyem i Springom.

2. Provjera graha u Jerseyu

Provjera valjanosti postupak je provjere poštuju li neki podaci jedno ili više unaprijed definiranih ograničenja. To je, naravno, vrlo čest slučaj korištenja u većini aplikacija.

Okvir za provjeru Java Bean-a (JSR-380) postao je de facto standard za rukovanje ovom vrstom operacija u Javi. Da biste se osvrnuli na osnove provjere valjanosti Java Bean-a, pogledajte naš prethodni vodič.

Jersey sadrži modul za proširenje za podršku provjeri graha. Da bismo koristili ovu mogućnost u našoj aplikaciji, prvo je moramo konfigurirati. U sljedećem ćemo odjeljku vidjeti kako konfigurirati našu aplikaciju.

3. Postavljanje aplikacije

Sada, nadogradimo se na jednostavnom primjeru Fruit API iz izvrsnog članka za podršku Jersey MVC.

3.1. Ovisnosti Mavena

Prije svega, dodajmo ovisnost Bean Validation na našu pom.xml:

 org.glassfish.jersey.ext dres-grah-validacija 2.27 

Najnoviju verziju možemo dobiti od Maven Central.

3.2. Konfiguriranje poslužitelja

U Jerseyju obično registriramo značajku proširenja koju želimo koristiti u našoj klasi prilagođene konfiguracije resursa.

Međutim, za proširenje valjanosti graha nema potrebe za registracijom. Srećom, ovo je jedno od rijetkih proširenja koje se okvir Jersey automatski registrira.

Konačno, poslati pogreške provjere valjanosti klijentu dodati ćemo svojstvo poslužitelja u našu prilagođenu konfiguraciju resursa:

javni ViewApplicationConfig () {paketi ("com.baeldung.jersey.server"); svojstvo (ServerProperties.BV_SEND_ERROR_IN_RESPONSE, true); } 

4. Provjera valjanosti metoda resursa JAX-RS

U ovom ćemo odjeljku objasniti dva različita načina provjere valjanosti ulaznih parametara pomoću bilješki ograničenja:

  • Korištenje ugrađenih ograničenja API-ja za provjeru graha
  • Stvaranje prilagođenog ograničenja i validatora

4.1. Korištenje ugrađenih bilješki ograničenja

Počnimo s gledanjem ugrađenih napomena o ograničenjima:

@POST @Path ("/ create") @Consumes (MediaType.APPLICATION_FORM_URLENCODED) public void createFruit (@NotNull (message = "Ime voća ne smije biti null") @FormParam ("name") Naziv niza, @NotNull (message = "Boja voća ne smije biti nula") @FormParam ("boja") Boja niza) {Voće = novo voće (ime, boja); SimpleStorageService.storeFruit (voće); } 

U ovom primjeru stvaramo novi Voće koristeći dva parametra obrasca, Ime i boja. Koristimo @NotNull napomena koja je već dio API-ja za provjeru graha.

To nameće jednostavno ne null ograničenje za naše parametre oblika. U slučaju da je jedan od parametara null, vratit će se poruka deklarirana u napomeni.

To ćemo, naravno, pokazati jedinstvenim testom:

@Test javna praznina givenCreateFruit_whenFormContainsNullParam_thenResponseCodeIsBadRequest () {Obrazac obrasca = novi obrazac (); form.param ("ime", "jabuka"); form.param ("boja", null); Odgovor odgovora = cilj ("voće / stvori"). Zahtjev (MediaType.APPLICATION_FORM_URLENCODED) .post (Entity.form (obrazac)); assertEquals ("Http odgovor treba biti 400", 400, response.getStatus ()); assertThat (response.readEntity (String.class), containsString ("Boja voća ne smije biti null")); } 

U gornjem primjeru, koristimo JerseyTest klasa podrške za testiranje našeg voćnog resursa. Šaljemo POST zahtjev s nulom boja i provjerite sadrži li odgovor očekivanu poruku.

Popis ugrađenih ograničenja za provjeru pogledajte dokumente.

4.2. Definiranje bilješke prilagođenog ograničenja

Ponekad moramo nametati složenija ograničenja. To možemo učiniti definiranjem vlastite prilagođene bilješke.

Koristeći naš jednostavni primjer API-ja za voće, zamislimo da moramo potvrditi da sve voće ima valjani serijski broj:

@PUT @Path ("/ update") @Consumes ("application / x-www-form-urlencoded") javna praznina updateFruit (@SerialNumber @FormParam ("serial") Niz serijski) {// ...} 

U ovom primjeru parametar serijski mora udovoljavati ograničenjima definiranim @Serijski broj, što ćemo definirati sljedeće.

Prvo ćemo definirati napomenu ograničenja:

@Retention (RetentionPolicy.RUNTIME) @Constraint (validatedBy = {SerialNumber.Validator.class}) public @interface SerialNumber {String message () default "Serijski broj ploda nije važeći"; Class [] groups () zadani {}; Klasa [] korisni teret () zadana {}; } 

Dalje ćemo definirati klasu validatora SerialNumber.Validator:

javna klasa Validator implementira ConstraintValidator {@Override javna void inicijalizira (SerialNumber serial) {} @Override public boolean isValid (String serial, ConstraintValidatorContext constraintValidatorContext) {String serialNumRegex = "^ \ d {3} - \ \ d {3} - \ \ d {3} - \ \ d {3} - \ \ d {3} - \ \ d {3} \ d {4} $ "; vratiti Pattern.matches (serialNumRegex, serial); }} 

Ključna stvar ovdje je Provjerivač razred mora implementirati ConstraintValidator gdje T je vrsta vrijednosti koju želimo provjeriti, u našem slučaju a Niz .

Konačno, zatim implementiramo našu prilagođenu logiku provjere valjanosti u isValid metoda.

5. Provjera resursa

Nadalje, Bean Validation API također nam omogućuje provjeru valjanosti objekata pomoću @Valid bilješka.

U sljedećem odjeljku objasnit ćemo dva različita načina provjere valjanosti klasa resursa pomoću ove napomene:

  • Prvo, zatražite provjeru valjanosti resursa
  • Drugo, provjera resursa odgovora

Počnimo dodavanjem @ Min napomena za našu Voće objekt:

@XmlRootElement javna klasa Voće {@ Min (vrijednost = 10, message = "Težina ploda mora biti 10 ili veća") privatna cijela težina; // ...} 

5.1. Zatražite potvrdu resursa

Prije svega, omogućit ćemo provjeru valjanosti pomoću @Valid u našem FruitResource razred:

@POST @Path ("/ create") @Consumes ("application / json") javna praznina createFruit (@Valid Fruit fruit) {SimpleStorageService.storeFruit (voće); } 

U gornjem primjeru, ako pokušamo stvoriti plod s težinom manjom od 10, dobit ćemo pogrešku validacije.

5.2. Provjera valjanosti resursa odgovora

Isto tako, u sljedećem ćemo primjeru vidjeti kako provjeriti valjanost resursa odgovora:

@GET @Valid @Produces ("application / json") @Path ("/ search / {name}") javni Fruit findFruitByName (@PathParam ("name") Ime niza) {return SimpleStorageService.findByName (name); }

Imajte na umu kako koristimo isto @Valid bilješka. Ali ovaj put ga koristimo na razini metode resursa kako bismo bili sigurni da je odgovor valjan.

6. Prilagođeni rukovatelj iznimkama

U ovom zadnjem dijelu ukratko ćemo pogledati kako stvoriti prilagođeni obrađivač iznimki. To je korisno kada želimo vratiti prilagođeni odgovor ako kršimo određeno ograničenje.

Počnimo s definiranjem našeg FruitExceptionMapper:

javna klasa FruitExceptionMapper implementira ExceptionMapper {@Override javni odgovor naResponse (ConstraintViolationException izuzetak) {return Response.status (Response.Status.BAD_REQUEST) .entity (pripremaMessage (iznimka)). type ("text / plain") .build (); } privatni String pripremitiMessage (ConstraintViolationException iznimka) {StringBuilder poruka = ​​novi StringBuilder (); za (ConstraintViolation cv: exception.getConstraintViolations ()) {message.append (cv.getPropertyPath () + "" + cv.getMessage () + "\ n"); } vratiti poruku.toString (); }}

Prije svega definiramo prilagođenog pružatelja mapiranja iznimki. Da bismo to učinili, provodimo ExceptionMapper sučelje pomoću a ConstraintViolationException.

Dakle, vidjet ćemo da kad se izuzme ova iznimka naOdgovor bit će pozvana metoda naše prilagođene instance mapper iznimke.

Također, u ovom jednostavnom primjeru ponavljamo sva kršenja i dodajemo svako svojstvo i poruku koje ćemo vratiti u odgovor.

Dalje, da bismo koristili naš prilagođeni mapper iznimki moramo registrirati svog davatelja usluga:

@Override zaštićena aplikacija configure () {ViewApplicationConfig config = new ViewApplicationConfig (); config.register (FruitExceptionMapper.class); povratak config; }

Konačno, dodajemo krajnju točku za vraćanje nevaljanog Voće za prikaz obrađivača iznimki na djelu:

@GET @Produces (MediaType.TEXT_HTML) @Path ("/ iznimka") @Validna javna Fruit iznimka () {Voćno voće = novo Voće (); fruit.setName ("a"); fruit.setColour ("b"); vratiti voće; } 

7. Zaključak

Da rezimiramo, u ovom uputstvu istražili smo proširenje API-ja za provjeru valjanosti zrna Jersey Bean.

Prvo smo započeli s predstavljanjem kako se API za provjeru graha može koristiti u Jerseyu. Također, pogledali smo kako konfigurirati primjer web aplikacije.

Napokon, pogledali smo nekoliko načina provjere valjanosti s Jerseyem i kako napisati prilagođeni rukovatelj iznimkama.

Kao i uvijek, puni izvorni kôd članka dostupan je na GitHub-u.


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