Nuevo artículo tratando esta posibilidad tan interesante que es crear una anotación para filtrar datos. En este caso, vamos a crear un filtro clásico que es comprobar si una clave existe en una tabla determinada, y para utilizarlo, solo deberemos añadir al campo que debe contener la clave la anotación: @CheckCineValidation.
Preparando la aplicación
Igual que hicimos en el articulo anterior, en donde creábamos un filtro de DNI, lo primero que debemos recordar es añadir la dependencia a nuestra aplicacion, que si estamos trabajando con SpringBoot y maven, será añadirle al pom.xml
<!-- Para las validaciones -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<!-- fin validaciones -->
y después ya podemos iniciar nuestro trabajo
Creación de la anotación @CheckCineValidation
Como vimos en el post anterior, para la creación de la anotación, lo primero es definir la interfaz con el nombre que queremos, en donde especificamos ya, tambien la clase que realizada la validación, que en este caso será CheckCineValidator.
CheckCineValidation.java
package com.recursosformacion.lcs.util.constraint.interfaces;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import com.recursosformacion.lcs.util.constraint.validator.CheckCineValidator;
import java.lang.annotation.RetentionPolicy;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.PARAMETER;
import jakarta.validation.Payload;
import jakarta.validation.Constraint;
@Target( { FIELD, PARAMETER })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = CheckCineValidator.class)
public @interface CheckCineValidation {
public String message() default "Se ha indicado un cine que no existe";
public Class<?>[] groups() default {};
public Class<? extends Payload>[] payload() default {};
}
Como vimos en el caso anterior, definimos la anotacion indicando que:
- se utiliza a nivel de campo (@Target( { FIELD, PARAMETER })),
- la validación la hacemos en CheckCineValidator
- El mensaje por defecto es «Se ha indicado un cine que no existe»
Realizando el filtro
Hemos dicho que la comprobación la haremos en CheckCineValidator, y, para eso, creamos dicha clase, implementando ConstraintValidator al que se le debe indicar que la validacion que hacemos es CheckCineValidation y que el campo que esperamos recibir, es un Long, ya que asi es el campo en nuestro Entity
CheckCineValidator.java
package com.recursosformacion.lcs.util.constraint.validator;
import com.recursosformacion.lcs.repository.ICine;
import com.recursosformacion.lcs.util.constraint.interfaces.CheckCineValidation;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
public class CheckCineValidator implements ConstraintValidator<CheckCineValidation, Long>{
private final ICine cineRepository;
CheckCineValidator(ICine cineRepository){
this.cineRepository=cineRepository;
}
@Override
public boolean isValid(Long cine, ConstraintValidatorContext context) {
if (cine == null) return true;
return cine != null && cineRepository.existsById(cine);
}
}
Como veis, el filtro es muy sencillo, me basta con recibir el repositorio de Cine, y utilizar un método previsto en él, que es existById que me devuelve true o false, por lo que lo retorno en isValid, y con eso queda hecha la comprobación.
Utilizando la anotación.
Para filtrar el campo, solo debemos ir a la clase que lo contiene, en mi caso EntradaDTO, y alli poner la anotacion
Tal y como está puesto, si no se indica el cine, aparecerá el mensaje de linea 28, y si se indica, pero el cine no existe en la tabla correspondiente, el mensaje que aparecerá será el que indicamos en la interfaz : «Se ha indicado un cine que no existe»
Solo recordaros la necesidad de indicar en el controlador, que es donde queremos filtrar, el @Valid
o
Probando la aplicacion
Utilizando Postman, y con el módulo ControllerExceptionValidation , que veremos mas adelante, podemos ver las respuesta cuando ent_cine no existe
o cuando no se indica ent_cine
Conclusión
Todo este desarrollo lo teneis explicado con mas detalle en youTube (a partir de 1/02/24) , y, aunque es conveniente que intentéis escribirlo TODO vosotros, si queréis renunciar a ello, lo teneis tambien en GitHub
Este desarrollo esta hecho para disponer de un fuente para explicar otros temas, tal y como se indica en Visión de conjunto con Spring
Relacionado
Descubre más desde Recursos para formacion
Suscríbete y recibe las últimas entradas en tu correo electrónico.