Érvényesítés a tavaszi csomagtartóban

1. Áttekintés

Ami a felhasználói adatok validálását illeti, a Spring Boot erőteljes támogatást nyújt ehhez a gyakori, mégis kritikus feladathoz, közvetlenül a dobozból.

Bár a Spring Boot támogatja a zökkenőmentes integrációt az egyedi validátorokkal, az érvényesítés tényleges szabványa a Hibernate Validator, a Bean Validation Framework referenciamegvalósítása.

Ebben az oktatóanyagban megnézzük, hogyan érvényesítsük a tartományi objektumokat a Spring Boot alkalmazásban.

2. A Maven-függőségek

Ebben az esetben megtanuljuk, hogyan érvényesítsük a tartományi objektumokat a Spring Boot alkalmazásban egy alap REST vezérlő kiépítésével.

A vezérlő először egy tartományobjektumot vesz fel, majd a Hibernate Validator segítségével ellenőrzi, és végül a memóriában lévő H2 adatbázisba tárolja.

A projekt függőségei meglehetősen szabványosak:

 org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-data-jpa com.h2database h2 1.4.197 futásidejű 

Ahogy fentebb bemutattuk, belefoglaltuk tavasz-boot-starter-web miénkben pom.xml fájlt, mert szükségünk lesz rá a REST vezérlő létrehozásához. Ezenkívül ellenőrizzük a legújabb verziókat tavasz-bakancs-indító-jpa és a M2 Central H2 adatbázisát.

A Boot 2.3-tól kezdve kifejezetten hozzá kell adnunk a spring-boot-starter-validation függőség:

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

3. Egyszerű domain osztály

Miután projektünk függősége már megvan, a következőkben meg kell határoznunk egy példát a JPA entitásosztályra, amelynek szerepe kizárólag a felhasználók modellezése lesz.

Vessünk egy pillantást erre az osztályra:

@Entity public class User {@Id @GeneratedValue (strategy = GenerationType.AUTO) private long id; @NotBlank (message = "A név kötelező") privát karakterlánc neve; @NotBlank (message = "Az e-mail kötelező") privát karakterlánc e-mail; // standard kivitelezők / beállítók / getters / toString}

A mi Felhasználó entitás osztály valóban vérszegény, de dióhéjban megmutatja, hogyan kell felhasználni a Bean Validation korlátozásait a név és email mezők.

Az egyszerűség kedvéért a célmezőket csak a @NotBlank kényszer. Ezenkívül megadtuk a hibaüzeneteket a üzenet tulajdonság.

Ezért amikor a Spring Boot ellenőrzi az osztálypéldányt, a korlátozott mezőket nem lehet null, és a vágott hosszuknak nullánál nagyobbnak kell lennie.

Ezenkívül a babellenőrzés sok más praktikus korlátozást is tartalmaz @NotBlank. Ez lehetővé teszi számunkra, hogy különböző érvényesítési szabályokat alkalmazzunk és kombináljunk a korlátozott osztályokra. További információkért kérjük, olvassa el a hivatalos babellenőrzési dokumentumokat.

Mivel a Spring Data JPA-t felhasználjuk a felhasználók memóriában lévő H2 adatbázisba történő mentésére, meg kell határoznunk egy egyszerű adattár interfészt is az alapvető CRUD funkciók használatához Felhasználó tárgyak:

@Repository nyilvános felület A UserRepository kiterjeszti a CrudRepository {}

4. A REST vezérlő megvalósítása

Természetesen olyan réteget kell megvalósítanunk, amely lehetővé teszi számunkra a hozzárendelt értékek megszerzését Felhasználó objektum korlátozott mezői.

Ezért validálhatjuk őket és elvégezhetünk néhány további feladatot, az érvényesítési eredményektől függően.

Tavaszi Csizma teszi ez a látszólag összetett folyamat nagyon egyszerű egy REST vezérlő megvalósításával.

Nézzük meg a REST vezérlő megvalósítását:

@RestController public class UserController {@PostMapping ("/ users") ResponseEntity addUser (@Valid @RequestBody User user) {// a felhasználó visszatérítésének fenntartása ResponseEntity.ok ("A felhasználó érvényes"); } // szabványos kivitelezők / egyéb módszerek} 

Tavaszi REST kontextusban a felhasználó hozzáadása() módszer meglehetősen szabványos.

Természetesen a legrelevánsabb rész a @Érvényes annotáció.

Amikor a Spring Boot talál egy argumentumot, amellyel jegyzetelt @Érvényes, automatikusan indítja az alapértelmezett JSR 380 megvalósítást - a Hibernate Validator - és érvényesíti az argumentumot.

Amikor a cél argumentum nem éri el az érvényesítést, a Spring Boot dob ​​egy MethodArgumentNotValidException kivétel.

5. A @ExceptionHandler Megjegyzés

Bár nagyon hasznos, ha a Spring Boot ellenőrzi a Felhasználó objektum továbbadva a felhasználó hozzáadása() módszerrel, ennek a folyamatnak a hiányzó aspektusa az, ahogyan az érvényesítési eredményeket feldolgozzuk.

A @ExceptionHandler annotáció lehetővé teszi számunkra, hogy a meghatározott típusú kivételeket egyetlen módszerrel kezeljük.

Ezért felhasználhatjuk az ellenőrzési hibák feldolgozására:

@ResponseStatus (HttpStatus.BAD_REQUEST) @ExceptionHandler (MethodArgumentNotValidException.class) public Map handleValidationExceptions (MethodArgumentNotValidException ex) {Map hibák = új HashMap (); ex.getBindingResult (). getAllErrors (). forEach ((error) -> {String fieldName = ((FieldError) error) .getField (); String errorMessage = error.getDefaultMessage (); errors.put (fieldName, errorMessage); }); visszatérési hibák; }

Meghatároztuk a MethodArgumentNotValidException kivétel, mint kezelendő kivétel. Következésképpen a Spring Boot ezt a módszert fogja hívni amikor a meghatározott Felhasználó az objektum érvénytelen.

A módszer az érvénytelen mezők nevét és utólagos ellenőrzési hibaüzenetét tárolja a Térkép. Ezután elküldi a Térkép vissza az ügyfélhez JSON-képviseletként további feldolgozás céljából.

Egyszerűen fogalmazva: a REST vezérlő lehetővé teszi számunkra, hogy könnyedén feldolgozzuk a kéréseket különböző végpontokra, érvényesítsük őket Felhasználó objektumokat, és a válaszokat JSON formátumban küldje el.

A kialakítás elég rugalmas ahhoz, hogy a vezérlő válaszait több web-szinten kezelje, a sablonmotoroktól, például a Thymeleaf, a teljes funkcionalitású JavaScript keretrendszerig, például az Angularig.

6. A REST vezérlő tesztelése

Egy integrációs teszttel könnyen tesztelhetjük a REST vezérlőnk működését.

Kezdjük gúnyolni / autowiringet a UserRepository interfész megvalósítása, a UserController például, és a MockMvc tárgy:

@RunWith (SpringRunner.class) @WebMvcTest @AutoConfigureMockMvc public class UserControllerIntegrationTest {@MockBean private UserRepository userRepository; @Autowired UserController userController; @Autowired privát MockMvc mockMvc; // ...} 

Mivel csak a webréteget teszteljük, a @WebMvcTest annotáció. Ez lehetővé teszi számunkra a kérések és válaszok egyszerű tesztelését a MockMvcRequestBuilders és MockMvcResultMatchers osztályok.

Most teszteljük a felhasználó hozzáadása() módszer érvényes és érvénytelen Felhasználó a kérelem törzsében átadott objektum:

@Test public void, amikor aPostRequestToUsersAndValidUser_thenCorrectResponse () kivételt dob ​​{MediaType textPlainUtf8 = new MediaType (MediaType.TEXT_PLAIN, Charset.forName ("UTF-8")); Karakterlánc user = "{\" name \ ": \" bob \ ", \" email \ ": \" [email protected] \ "}"; mockMvc.perform (MockMvcRequestBuilders.post ("/ users") .content (user) .contentType (MediaType.APPLICATION_JSON_UTF8)) .andExpect (MockMvcResultMatchers.status (). isOk () .ock () .ock (). textPlainUtf8)); } @Test public void, amikor aPostRequestToUsersAndInValidUser_thenCorrectResponse () kiveti a {String user = "{\" name \ ": \" \ ", \" email \ ": \" [email protected] \ "}" kivételt; mockMvc.perform (MockMvcRequestBuilders.post ("/ users") .content (user) .contentType (MediaType.APPLICATION_JSON_UTF8)) .andExpect (MockMvcResultMatchers.status (). isBadRequest (()). ", Is.is (" A név kötelező "))) .andExpect (MockMvcResultMatchers.content () .contentType (MediaType.APPLICATION_JSON_UTF8)); }} 

Ezen felül tesztelhetjük a REST vezérlő API-t egy ingyenes API életciklus-tesztelő alkalmazás használatával, például a Postás.

7. A minta alkalmazás futtatása

Végül egy standardal futtathatjuk a példaprojektünket fő() módszer:

@SpringBootApplication public class Application {public static void main (String [] args) {SpringApplication.run (Application.class, args); } @Bean public CommandLineRunner futtatás (UserRepository userRepository) dobja a Kivétel {return (String [] argumentum) -> {User user1 = új felhasználó ("Bob", "[email protected]"); User2 felhasználó = új felhasználó ("Jenny", "[e-mail védett]"); userRepository.save (user1); userRepository.save (user2); userRepository.findAll (). forEach (System.out :: println); }; }} 

Ahogy az várható volt, látnunk kellene párat Felhasználó a konzolba kinyomtatott tárgyak.

POST kérés a // localhost: 8080 / users végponthoz érvényes Felhasználó objektum visszaadja a Húr „A felhasználó érvényes”.

Hasonlóképpen, a POST kérés a Felhasználó tárgy nélkül név és email értékek a következő választ adják vissza:

{"name": "A név kötelező", "email": "Az e-mail kötelező"}

8. Következtetés

Ebben a cikkben, megtanultuk az érvényesítés alapjait a Spring Boot-ban.

Szokás szerint a cikkben bemutatott összes példa elérhető a GitHubon.