É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.