Validadores en Spring Boot

validadores en spring boot

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

Spring Boot initializr | Validadores en Spring Boot
Spring Boot initializr

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!


Deja una respuesta

Tu dirección de correo electrónico no será publicada.