Spring boot validação personalizada

Vamos lá! Como de costume, vamos utilizar o projeto criado nesse post onde utilizamos anotações de validação do pacote javax.validation. Agora vamos mostrar como criar uma validação personalizada com anotação própria.

Primeiramente vamos criar a anotation

 package com.br.davifelipe.springjwt.services.validation;
import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
import javax.validation.Constraint;
 import javax.validation.Payload;
@Constraint(validatedBy = CategorySaveValidator.class)
 @Target({ ElementType.TYPE })
 @Retention(RetentionPolicy.RUNTIME)
 public @interface CategorySave {
     String message() default "Validation error";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
 }
 

A anotação constraint indica que nossa anotação personalizada vai ser validada pela classe CategorySaveValidator que vamos criar

 package com.br.davifelipe.springjwt.services.validation;
import java.util.ArrayList;
 import java.util.List;
import javax.validation.ConstraintValidator;
 import javax.validation.ConstraintValidatorContext;
import com.br.davifelipe.springjwt.dto.CategoryDTO;
 import com.br.davifelipe.springjwt.resources.exceptions.FieldMessage;
public class CategorySaveValidator implements ConstraintValidator<CategorySave, CategoryDTO> {
     @Override
     public void initialize(CategorySave ann) {
     }
    @Override
     public boolean isValid(CategoryDTO objDto, ConstraintValidatorContext context) {
         List<FieldMessage> erros = new ArrayList<>();
         
         //Make custom validations here and add that in que erros list 
         if(objDto.getName().equals("null")) {
             erros.add(new FieldMessage("name","can not be String null"));
         }
         
         for (FieldMessage e : erros) {
             context.disableDefaultConstraintViolation();
             context.buildConstraintViolationWithTemplate(e.getMessage()).addPropertyNode(e.getFieldName())
                     .addConstraintViolation();
         }
         return erros.isEmpty();
     }
 }
 

A lógica da classe de validação é bem simples. Vou implementar as regras de validação personalizadas e adicionar os erros na lista de FieldMessage que é uma classe personalizada que criamos para armazerar o nome do campo e o erro. Em seguida percorremos essa lista e adicionamos nossos erros personalizados no contexto de validação do framework. Se a lista tiver vazia (sem erros) retorna true indicando que passou na validação.

Agora basta adicionar a anotação no DTO 

 package com.br.davifelipe.springjwt.dto;
import javax.validation.constraints.NotNull;
 import javax.validation.constraints.Size;
import com.br.davifelipe.springjwt.services.validation.CategorySave;
import lombok.Data;
@Data
 @CategorySave
 public class CategoryDTO {
     
     Integer id;
     
     @NotNull
     @Size(min=2, max=30)
     String name;
 }
 

E testar

Imagem

https://github.com/davifelipems/spring-backend-template/tree/custom_validation

Comentários

 

Quem Sou

Graduado em ADS (Análise e desenvolvimento de sistemas).

Não sou "devoto" de nenhuma linguagem de programação. Procuro aproveitar o melhor de cada uma de acordo com a necessidade do projeto. Prezo por uma arquitetura bem feita, código limpo, puro e simples! 

anuncio atendente