Provjera valjanosti u proljetnom pokretanju

1. Pregled

Što se tiče provjere valjanosti korisničkog unosa, Spring Boot pruža snažnu podršku za ovaj uobičajeni, ali kritični zadatak, izravno iz kutije.

Iako Spring Boot podržava besprijekornu integraciju s prilagođenim validatorima, de facto standard za provođenje provjere valjanosti je Hibernate Validator, referentna provedba okvira za provjeru graha.

U ovom vodiču, pogledat ćemo kako provjeriti valjanost objekata domene u Spring Boot-u.

2. Ovisnosti Mavena

U ovom ćemo slučaju naučiti kako provjeriti valjanost objekata domene u Spring Boot-u izgradnjom osnovnog REST kontrolera.

Kontroler će prvo uzeti objekt domene, zatim će ga provjeriti s Hibernate Validatorom, a na kraju će ustrajati u H2 bazi podataka u memoriji.

Ovisnosti o projektu prilično su standardne:

 org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-data-jpa com.h2database h2 1.4.197 runtime 

Kao što je gore prikazano, uključili smo proljeće-boot-starter-web u našem pom.xml datoteku jer će nam trebati za stvaranje REST kontrolera. Uz to, provjerimo najnovije verzije sustava Windows opruga-čizma-starter-jpa i H2 baza podataka o Maven Central.

Počevši od Boot 2.3, također moramo izričito dodati proljeće-boot-starter-validacija ovisnost:

 org.springframework.boot spring-boot-starter-validation 

3. Jednostavna klasa domene

S već postojećim ovisnostima našeg projekta, sljedeći moramo definirati primjer klase JPA entiteta, čija će uloga biti isključivo modeliranje korisnika.

Pogledajmo ovaj razred:

@Entity javni razred korisnika {@Id @GeneratedValue (strategy = GenerationType.AUTO) private long id; @NotBlank (message = "Ime je obavezno") ime privatnog niza; @NotBlank (message = "E-pošta je obavezna") privatni niz e-pošte; // standardni konstruktori / postavljači / getteri / toString}

Provedba našeg Korisnik Entitet je prilično anemičan, ali ukratko pokazuje kako koristiti ograničenja Bean Validation za ograničavanje Ime i e-mail polja.

Radi jednostavnosti, ograničili smo ciljna polja koristeći samo @NetBlank ograničenje. Također smo naveli poruke o pogreškama s poruka atribut.

Stoga, kada Spring Boot provjeri valjanost instance klase, ograničena polja ne smiju biti nule i njihova obrezana duljina mora biti veća od nule.

Uz to, provjera valjanosti graha osim toga nudi i mnoga druga praktična ograničenja @NetBlank. To nam omogućuje primjenu i kombiniranje različitih pravila provjere valjanosti na ograničene klase. Za daljnje informacije pročitajte službene dokumente za provjeru graha.

Budući da ćemo koristiti Spring Data JPA za spremanje korisnika u H2 bazu podataka u memoriji, također moramo definirati jednostavno sučelje spremišta za uključivanje osnovnih CRUD funkcija Korisnik objekti:

Javno sučelje @Repository UserRepository proširuje CrudRepository {}

4. Implementacija REST kontrolera

Naravno, moramo implementirati sloj koji nam omogućuje dobivanje vrijednosti dodijeljenih našem Korisnik ograničena polja objekta.

Stoga ih možemo provjeriti i izvršiti nekoliko daljnjih zadataka, ovisno o rezultatima provjere valjanosti.

Spring Boot čini ovaj naizgled složen postupak zaista jednostavan kroz implementaciju REST kontrolera.

Pogledajmo implementaciju REST kontrolera:

@RestController javna klasa UserController {@PostMapping ("/ users") ResponseEntity addUser (@Valid @RequestBody User user) {// uporno vraćanje korisnika ResponseEntity.ok ("Korisnik je valjan"); } // standardni konstruktori / ostale metode} 

U proljetnom REST kontekstu, provedba addUser () metoda je prilično standardna.

Naravno, najrelevantniji dio je upotreba @Valid bilješka.

Kada Spring Boot pronađe argument označen s @Valid, automatski pokreće zadanu implementaciju JSR 380 - Hibernate Validator - i potvrđuje argument.

Kada ciljni argument ne uspije proći provjeru, Spring Boot baca a MethodArgumentNotValidException iznimka.

5. The @ExceptionHandler Bilješka

Iako je vrlo zgodno imati Spring Boot koji provjerava valjanost Korisnik objekt proslijeđen na addUser () metodom automatski, nedostajući aspekt ovog postupka je način na koji obrađujemo rezultate provjere valjanosti.

The @ExceptionHandler bilješka omogućuje nam obradu određenih vrsta iznimaka kroz jednu jedinu metodu.

Stoga ga možemo koristiti za obradu pogrešaka provjere valjanosti:

@ResponseStatus (HttpStatus.BAD_REQUEST) @ExceptionHandler (MethodArgumentNotValidException.class) javna karta handleValidationExceptions (MethodArgumentNotValidException ex) {Pogreške karte = nova HashMap (); ex.getBindingResult (). getAllErrors (). forEach ((error) -> {String fieldName = ((FieldError) error) .getField (); String errorMessage = error.getDefaultMessage (); error.put (fieldName, errorMessage); }); vratiti pogreške; }

Naveli smo MethodArgumentNotValidException iznimka kao iznimka kojom se treba rukovati. Slijedom toga, Spring Boot će pozvati ovu metodu kad je navedeno Korisnik objekt je nevažeći.

Metoda pohranjuje ime i poruku o pogrešci nakon provjere valjanosti svakog nevaljanog polja u Karta. Dalje šalje Karta natrag klijentu kao JSON prikaz za daljnju obradu.

Jednostavno rečeno, REST kontroler omogućuje nam lako obrađivanje zahtjeva u različite krajnje točke, provjeru valjanosti Korisnik objekata i odgovore pošaljite u JSON formatu.

Dizajn je dovoljno fleksibilan da obrađuje odgovore kontrolera kroz nekoliko web razina, u rasponu od pokretačkih mehanizama poput Thymeleafa, do cjelovitog JavaScript okvira kao što je Angular.

6. Testiranje REST kontrolera

Funkcionalnost našeg REST kontrolera možemo jednostavno testirati integracijskim testom.

Počnimo s ruganjem / automatskim povezivanjem UserRepository implementacija sučelja, zajedno s UserController instanci i MockMvc objekt:

@RunWith (SpringRunner.class) @WebMvcTest @AutoConfigureMockMvc javna klasa UserControllerIntegrationTest {@MockBean private UserRepository userRepository; @Autowired UserController userController; @Autowired private MockMvc mockMvc; // ...} 

Budući da testiramo samo web sloj, koristimo @WebMvcTest bilješka. Omogućuje nam lako testiranje zahtjeva i odgovora pomoću skupa statičkih metoda koje implementira MockMvcRequestBuilders i MockMvcResultMatchers razreda.

Ajmo sada testirati addUser () metoda s valjanom i nevaljanom Korisnik objekt proslijeđen u tijelu zahtjeva:

@Test public void whenPostRequestToUsersAndValidUser_thenCorrectResponse () baca izuzetak {MediaType textPlainUtf8 = new MediaType (MediaType.TEXT_PLAIN, Charset.forName ("UTF-8")); Niz korisnika = "{\" ime \ ": \" bob \ ", \" e-pošta \ ": \" [e-pošta zaštićena] \ "}"; mockMvc.perform (MockMvcRequestBuilders.post ("/ users") .content (user) .contentType (MediaType.APPLICATION_JSON_UTF8)) .andExpect (MockMvcResultMatchers.status (). isOk ()) .MandExpect. textPlainUtf8)); } @Test public void whenPostRequestToUsersAndInValidUser_thenCorrectResponse () baca iznimku {String user = "{\" name \ ": \" \ ", \" email \ ": \" [email protected] \ "}"; mockMvc.perform (MockMvcRequestBuilders.post ("/ users") .content (user) .contentType (MediaType.APPLICATION_JSON_UTF8)) .andExpect (MockMvcResultMatchers.status (). isBadRequest (). ", Is.is (" Ime je obavezno "))) .andExpect (MockMvcResultMatchers.content () .contentType (MediaType.APPLICATION_JSON_UTF8)); }} 

Osim toga, možemo testirati API REST kontrolera koristeći besplatnu aplikaciju za testiranje životnog ciklusa API-ja, poput Poštara.

7. Pokretanje uzorka aplikacije

Napokon, možemo pokrenuti naš primjer projekta sa standardom glavni() metoda:

@SpringBootApplication javna klasa Application {public static void main (String [] args) {SpringApplication.run (Application.class, args); } @Bean javno izvršavanje CommandLineRunner (UserRepository userRepository) baca izuzetak {return (String [] args) -> {User user1 = novi korisnik ("Bob", "[email protected]"); Korisnik user2 = novi korisnik ("Jenny", "[e-pošta zaštićena]"); userRepository.save (user1); userRepository.save (user2); userRepository.findAll (). forEach (System.out :: println); }; }} 

Očekivano, trebali bismo vidjeti nekoliko Korisnik objekti ispisani u konzoli.

POST zahtjev za // localhost: 8080 / users krajnju točku s važećim Korisnik objekt će vratiti Niz "Korisnik je valjan".

Isto tako, POST zahtjev sa Korisnik objekt bez Ime i e-mail vrijednosti vratit će sljedeći odgovor:

{"name": "Ime je obavezno", "email": "Email je obavezno"}

8. Zaključak

U ovom članku, naučili smo osnove izvođenja provjere valjanosti u Spring Boot-u.

Kao i obično, svi primjeri prikazani u ovom članku dostupni su na GitHubu.