Anotação Customizada com Bean Validation

Como criar uma anotação com Bean Validation.

Neste post irei mostrar como fazer uma anotação para validar uma propriedade do seu modelo utilizando Bean Validation.

O exemplo que preparei cria uma anotação que valida placas de carro no formato brasileiro. Ex: “AAA-1234”.

A primeira etapa é criar a anotação @PlacaCarro.

package com.matheuspcarvalho.anotations;

import java.lang.annotation.Documented;
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;

import com.matheuspcarvalho.validators.PlacaCarroValidator;

@Constraint(validatedBy = PlacaCarroValidator.class)
@Documented
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface PlacaCarro
{
   
  String message() default "Formato de placa inválido";
  Class[] groups() default { };
  Class<? extends Payload>[] payload() default { };
 
}


Em @Constraint(validatedBy = PlacaCarroValidator.class) define qual classe será responsável por validar o atributo anotado com
@PlacaCarro.

A mensagem padrão para ser mostrada caso o atributo esteja no formato incorreto é definida em: String message() default “Formato de placa inválido”;.

A próxima etapa é Criar a classe PlacaCarroValidator.

package com.matheuspcarvalho.validators;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

import com.matheuspcarvalho.anotations.PlacaCarro;

public class PlacaCarroValidator implements ConstraintValidator {

    private Pattern padrao = Pattern.compile("^[a-zA-Z]{3}\\-\\d{4}$");

    @Override
    public void initialize(PlacaCarro constraintAnnotation) {

    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {

	if (value == null || "".equals(value)) {
	    return true;
	}

           Matcher matcher = padrao.matcher(value);
	   return matcher.matches();
	}

}

Um padrão é definido  através de uma expressão regular na classe para verificarmos o valor que o metodo isValid irá receber.

Abaixo está a classe de teste para o validator.

package com.matheuspcarvalho;

import org.junit.Assert;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import com.matheuspcarvalho.validators.PlacaCarroValidator;

@RunWith(SpringRunner.class)
@SpringBootTest
public class CustomBeanValidationApplicationTests {

	@Test
	public void testPlacaCarroInvalida() {
		PlacaCarroValidator placaCarroValidator = new PlacaCarroValidator();
		Assert.assertFalse(placaCarroValidator.isValid("112-1234", null));
		Assert.assertFalse(placaCarroValidator.isValid("AB-1234", null));
		Assert.assertFalse(placaCarroValidator.isValid("A-123", null));

	}

	@Test
	public void testPlacaCarroValida() {
		PlacaCarroValidator placaCarroValidator = new PlacaCarroValidator();
		Assert.assertTrue(placaCarroValidator.isValid("ABC-1234", null));
		Assert.assertTrue(placaCarroValidator.isValid("DEF-5678", null));
		Assert.assertTrue(placaCarroValidator.isValid("GHI-5678", null));

	}

}

Agora sim o atributo pode ser anotado.

package com.matheuspcarvalho.models;

import com.matheuspcarvalho.anotations.PlacaCarro;

public class CarroModel {

	@PlacaCarro
	private String placa;

	public String getPlaca() {
		return placa;
	}

	public void setPlaca(String placa) {
		this.placa = placa;
	}

}

Podemos sobrescrever a mensagem padrão da seguinte maneira:
@PlacaCarro(message=”O campo placa deve estar formatado corretamente”) .

Pronto temos uma classe com nossa anotação customizada , você pode ver o código fonte do projeto aqui!

Espero ter ajudado alguém neste post, até  a próxima! 🙂

2 comentários em “Anotação Customizada com Bean Validation”

Deixe um comentário