Anotação Customizada com Bean Validation

Como criar uma anotação com Bean Validation.

Anúncios

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

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s