Validadores en Spring Boot
Cuando trabajamos en una aplicación Spring Boot, o cualquier apliación, uno de los puntos más importantes es añadir validaciones. Para solventar estos problemas vamos a poder añadir validadores en Spring Boot en nuestras entidades, modelos etc, para evitar tener que añadir líneas de código y hacer nuestro código más complejo y menos legible.
A continuación vamos a ver una pequeña introducción para añadir diferentes validaciones a nivel de campos añadiendo restricciones para nuestra Base de Datos y peticiones Rest.
Ejemplo aplicación Spring Boot con Validadores
A continuación vamos a realizar un simple ejemplo apoyándonos en el initializr de Spring Boot. Añadiremos las dependencias de Spring Data, H2, Web y Validation de Hibernate. De esta manera podamos crear una aplicación con conexión a BBDD y que se encuentre expuesta por un controlador.
Dependencias Maven
Spring Boot a través de sus starters nos va a permitir añadir la siguiente dependencia para validaciones:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
Creación de validaciones a nivel de Campo en Spring Boot
Una vez hemos añadido la dependencia vamos a crear una aplicación en Spring Boot con una clase Entity Car con restricciones en BBDD además, añadiremos una clase que hará de modelo con restricciones que se ejecutarán cuando se hace una petición al controlador.
Vamos a comenzar creando nuestra clase entidad:
@Entity @NoArgsConstructor @Getter @Setter public class CarEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @NotNull @NotBlank private String color; @NotNull private String model; @NotNull @NotBlank(message = "plate is required") @Size(min = 5, max = 10) private String plate; }
Esta clase deberá ir acompañada de su respectivo repository:
@Repository public interface CarRepository extends CrudRepository<CarEntity, Long> {}
A continuación vamos a crear una clase DTO que será la encargada de acceder a la aplicación y de dar salida de la aplicación.
@Getter @Setter @NoArgsConstructor public class CarDTO { @NotNull @NotBlank private String color; @NotNull private String model; @NotNull @NotBlank(message = "plate is required") @Size(min = 5, max = 10) private String plate; }
Con las anteriores clases lo que estamos haciendo e indicando a Spring que los campos model y color no pueden estar vacíos, si eso ocurriese mostraríamos un mensaje de error. Además hacemos uso de otra anotación que @NotNull para indicar que «brand» no puede ser null.
Creación de Controlador
Una vez hemos creado nuestro objeto DTO y nuestra entidad de Base de Datos, vamos a crear una capa controladora que será el punto de entrada de nuestra aplicación.
Por simplicidad, en controlador invocará al repository. Y tendrá el objeto DTO con las restricciones que hemos definido anteriormente.
@RequiredArgsConstructor @RequestMapping("/cars") public class CarController { private final CarRepository carRepository; private final CarMapper carMapper; @GetMapping public ResponseEntity<CarDTO> saveCar(@Valid @RequestBody CarDTO carDTO) { var car = carMapper.toDto( carRepository.save(carMapper.toEntity(carDTO))); return ResponseEntity.ok(car); } }
En el controlador anterior vemos la parte de la validación mediante la anotación @Valid dentro de los parámetros del método. Esta anotación se encargará de validar el objeto que llega, validando los argumentos. La validación es del estándar JSR380. Cuando la validación falla se lanzará un MethodArgumentNotValidException de Spring.
Lo normal sería capturar esa excepción y poderla exponer hacia fuera con un ControllerAdvice por ejemplo, de esta manera expondríamos de una manera Rest el error.
Probando una apliación en Spring Boot
Vamos a crear un test para probar la validación de nuestra aplicación, a parte de probarla manualmente, los test son imprescindibles para garantizar el funcionamiento de nuestra aplicación.
Vamos a crear test integrados para garantizar el buen funcionamiento de nuestra aplicación, si quieres conocer más sobre testing en Spring Boot puedes echar un ojo aquí.
Para realizar test vamos a hacer uso de MockMvc de manera que podamos simular una entrada a nuestro controlador.
@Test void whenSaveCarIsInvoked_givenACarWithoutPlate_thenExceptionIsThrow() throws Exception { mockMvc.perform( MockMvcRequestBuilders.post("/cars") .contentType(MediaType.APPLICATION_JSON) .content(asJsonString(createCarDTO()))) .andExpect(status().is4xxClientError()); } @Test void whenSaveCarIsInvoked_givenACorrectCar_thenCarIsSaved() throws Exception { CarDTO carDTO = createCarDTO(); carDTO.setPlate("ASDFGA"); mockMvc.perform( MockMvcRequestBuilders.post("/cars") .contentType(MediaType.APPLICATION_JSON) .content(asJsonString(carDTO))) .andExpect(status().is2xxSuccessful()); }
Conclusión
En esta entrada hemos visto una introducción a validadores en Spring Boot, una funcionalidad y pieza imprescindible que nos ayudará a simplicar el códig de nuestras aplicaciones.
En próximos artículos veremos la creación de un validador propio que podremos añadir a nuestra capa de Objetos de Base de Datos.
Te puedes descargar el ejemplo de nuestro github aquí.
Si necesitas más información puedes escribirnos un comentario o un correo electrónico a refactorizando.web@gmail.com o también nos puedes contactar por nuestras redes sociales Facebook o twitter y te ayudaremos encantados!