Validácia v Spring Boot

1. Prehľad

Pokiaľ ide o overenie vstupu používateľa, Spring Boot poskytuje silnú podporu pre túto bežnú, ale kritickú úlohu, ktorá je k dispozícii okamžite.

Aj keď Spring Boot podporuje bezproblémovú integráciu s vlastnými validátormi, de facto štandardom na vykonávanie validácie je Hibernate Validator, referenčná implementácia rámca Bean Validation.

V tomto návode pozrieme sa na to, ako overiť objekty domény v Spring Boot.

2. Závislosti Maven

V tomto prípade sa naučíme, ako overiť objekty domény v Spring Boot vybudovaním základného radiča REST.

Radič najskôr vezme doménový objekt, potom ho overí pomocou Hibernate Validator a nakoniec ho uloží do H2 databázy v pamäti.

Závislosti projektu sú pomerne štandardné:

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

Ako je uvedené vyššie, zahrnuli sme spring-boot-starter-web v našom pom.xml súbor, pretože ho budeme potrebovať na vytvorenie radiča REST. Ďalej skontrolujte najnovšie verzie servera spring-boot-starter-jpa a databáza H2 na serveri Maven Central.

Počnúc bootom 2.3 musíme tiež explicitne pridať overenie štartéra pružiny a štartéra závislosť:

 org.springframework.boot validácia Spring-Boot-Starter 

3. Jednoduchá trieda domény

Keď už sú závislosti na našom projekte k dispozícii, musíme si ešte zadefinovať príklad triedy entity JPA, ktorej úlohou bude výlučne modelovanie používateľov.

Poďme sa pozrieť na túto triedu:

@Entity verejná trieda Používateľ {@Id @GeneratedValue (strategy = GenerationType.AUTO) súkromné ​​dlhé ID; @NotBlank (message = "Meno je povinné") súkromné ​​meno reťazca; @NotBlank (message = "E-mail je povinný") súkromný e-mail s reťazcom; // štandardné konštruktory / setre / getre / toString}

Implementácia našich Používateľ trieda entít je skutočne dosť anemická, ale v skratke ukazuje, ako využiť obmedzenia Bean Validation na obmedzenie názov a e-mail polia.

Pre jednoduchosť sme obmedzili cieľové polia iba pomocou @NotBlank obmedzenie. Tiež sme špecifikovali chybové správy pomocou správa atribút.

Preto keď Spring Boot overuje inštanciu triedy, obmedzené polia nesmú byť nulové a ich skrátená dĺžka musí byť väčšia ako nula.

Okrem toho Bean Validation poskytuje mnoho ďalších užitočných obmedzení @NotBlank. To nám umožňuje aplikovať a kombinovať rôzne overovacie pravidlá na obmedzené triedy. Ďalšie informácie nájdete v oficiálnych dokumentoch o overení fazule.

Pretože použijeme Spring Data JPA na ukladanie používateľov do databázy H2 v pamäti, musíme tiež definovať jednoduché rozhranie úložiska pre základné funkcie CRUD Používateľ objekty:

@Repository verejné rozhranie UserRepository rozširuje CrudRepository {}

4. Implementácia radiča REST

Samozrejme, musíme implementovať vrstvu, ktorá nám umožní získať hodnoty priradené k nášmu Používateľ obmedzené polia objektu.

Preto ich môžeme overiť a vykonať niekoľko ďalších úloh, v závislosti od výsledkov overenia.

Spring Boot robí tento zdanlivo zložitý proces je skutočne jednoduchý implementáciou kontrolóra REST.

Pozrime sa na implementáciu radiča REST:

@RestController verejná trieda UserController {@PostMapping ("/ users") ResponseEntity addUser (@Valid @RequestBody User user) {// pretrvávajúci návrat používateľa ResponseEntity.ok ("User is valid"); } // štandardné konštruktory / iné metódy} 

V kontexte jarného odpočinku sa implementácia addUser () metóda je pomerne štandardná.

Najdôležitejšou časťou je samozrejme použitie @ Platné anotácia.

Keď Spring Boot nájde argument anotovaný pomocou @ Platné, automaticky zavedie predvolenú implementáciu JSR 380 - Hibernate Validator - a potvrdí argument.

Keď cieľový argument nedokáže prejsť validáciou, Spring Boot hodí a MethodArgumentNotValidException výnimkou.

5. @ExceptionHandler Anotácia

Aj keď je skutočne užitočné mať Spring Boot potvrdzujúci Používateľ objekt odovzdaný do addUser () metóda automaticky, chýbajúcim aspektom tohto procesu je spôsob, akým spracujeme výsledky overenia.

The @ExceptionHandler anotácia nám umožňuje spracovávať určené typy výnimiek prostredníctvom jednej jedinej metódy.

Preto ho môžeme použiť na spracovanie chýb overenia:

@ResponseStatus (HttpStatus.BAD_REQUEST) @ExceptionHandler (MethodArgumentNotValidException.class) verejná mapa handleValidationExceptions (MethodArgumentNotValidException ex) {Map errors = new HashMap (); ex.getBindingResult (). getAllErrors (). forEach ((error) -> {String fieldName = ((FieldError) error) .getField (); String errorMessage = error.getDefaultMessage (); errors.put (fieldName, errorMessage); }); chyby vrátenia; }

Zadali sme MethodArgumentNotValidException výnimka ako výnimka, ktorá sa má vybaviť. V dôsledku toho Spring Boot túto metódu zavolá keď je uvedené Používateľ objekt je neplatný.

Metóda ukladá meno a chybové hlásenie po overení platnosti každého neplatného poľa do a Mapa. Ďalej pošle Mapa späť ku klientovi ako reprezentácia JSON na ďalšie spracovanie.

Jednoducho povedané, kontrolór REST nám umožňuje ľahko spracovať požiadavky na rôzne koncové body a overiť ich Používateľ objekty a odoslať odpovede vo formáte JSON.

Dizajn je dostatočne flexibilný na to, aby zvládol reakcie radiča na niekoľkých webových úrovniach, od šablónových nástrojov, ako je Thymeleaf, až po plnohodnotný rámec JavaScriptu, napríklad Angular.

6. Testovanie radiča REST

Funkčnosť nášho radiča REST môžeme ľahko otestovať pomocou integračného testu.

Začnime sa posmievať / autowiring UserRepository implementácia rozhrania spolu s UserController inštancie a MockMvc objekt:

@RunWith (SpringRunner.class) @WebMvcTest @AutoConfigureMockMvc verejná trieda UserControllerIntegrationTest {@MockBean súkromná UserRepository userRepository; @Autowired UserController userController; @Autowired private MockMvc mockMvc; // ...} 

Pretože testujeme iba webovú vrstvu, používame @WebMvcTest anotácia. Umožňuje nám to ľahko testovať požiadavky a odpovede pomocou sady statických metód implementovaných MockMvcRequestBuilders a MockMvcResultMatchers triedy.

Teraz otestujme addUser () metóda s platným a neplatným Používateľ objekt odovzdaný v tele žiadosti:

@Test public void whenPostRequestToUsersAndValidUser_thenCorrectResponse () vyvolá výnimku {MediaType textPlainUtf8 = new MediaType (MediaType.TEXT_PLAIN, Charset.forName ("UTF-8")); Reťazec user = "{\" name \ ": \" bob \ ", \" email \ ": \" [chránený e-mailom] \ "}"; mockMvc.perform (MockMvcRequestBuilders.post ("/ users") .content (user) .contentType (MediaType.APPLICATION_JSON_UTF8)) .andExpect (MockMvcResultMatchers.status (). isOk ()) .andExpect (Mock) textPlainUtf8)); } @Test public void whenPostRequestToUsersAndInValidUser_thenCorrectResponse () vyvolá výnimku {String user = "{\" name \ ": \" \ ", \" email \ ": \" [chránený e-mailom] \ "}"; mockMvc.perform (MockMvcRequestBuilders.post ("/ users") .content (user) .contentType (MediaType.APPLICATION_JSON_UTF8)) .andExpect (MockMvcResultMatchers.status (). isBadRequest ()) .andExpect ($) ", Is.is (" Meno je povinné "))) .andExpect (MockMvcResultMatchers.content () .contentType (MediaType.APPLICATION_JSON_UTF8)); }} 

Okrem toho môžeme otestovať API radiča REST pomocou bezplatnej aplikácie na testovanie životného cyklu API, napríklad Poštár.

7. Spustenie ukážkovej aplikácie

Na záver môžeme náš vzorový projekt spustiť so štandardom hlavný() metóda:

@SpringBootApplication verejná trieda Aplikácia {public static void main (String [] args) {SpringApplication.run (Application.class, args); } @Bean public Spustenie CommandLineRunner (UserRepository userRepository) vyvolá výnimku {return (String [] args) -> {User user1 = new User ("Bob", "[email protected]"); Používateľ user2 = nový Používateľ ("Jenny", "[chránený e-mailom]"); userRepository.save (user1); userRepository.save (user2); userRepository.findAll (). forEach (System.out :: println); }; }} 

Podľa očakávania by sme sa ich mali dočkať niekoľkých Používateľ predmety vytlačené v konzole.

Požiadavka POST na koncový bod // localhost: 8080 / users s platnou Používateľ objekt vráti String „Používateľ je platný“.

Rovnako tak požiadavka POST s a Používateľ objekt bez názov a e-mail hodnoty vrátia nasledujúcu odpoveď:

{"name": "Meno je povinné", "email": "E-mail je povinný"}

8. Záver

V tomto článku naučili sme sa základy vykonávania validácie v Spring Boot.

Ako obvykle sú všetky príklady zobrazené v tomto článku dostupné na GitHub.


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