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! 🙂
Parabéns pelo artigo, ficou muito bom e ainda teve testes únitarios? VIXIII TOP demais!
CurtirCurtido por 1 pessoa
Obrigado Mateus! 🙂
CurtirCurtir