Validação com anotações

Além da interface Validatable, a arquitetura disponibiliza a validação através de anotações. As anotações devem ser aplicadas a atributos das classes e indicam que esses atributos serão validados de acordo com a regra especificada pela anotação. As anotações disponíveis atualmente são:

Anotação Parâmetros Significado
@Cep - Valida se o campo é um CEP válido.
@CpfCnpj - Valida se o campo é um CPF ou CNPJ válido.
@Email - Valida se o campo é um e-mail válido.
@Future - Valida se a data informada está no futuro, ou seja, se é maior que a data atual.
@Length min, max Valida se o campo (String) tem tamanho mínimo ou máximo de acordo com os parâmetros informados.
@Max value Valida se o campo (numérico) não ultrapassa o valor máximo passado como parametro.
@Min value Valida se o campo (numérico) não é menor que o valor mínimo passado como parametro.
@Past - Valida se a data informada está no passado, ou seja, se é menor que a data atual.
@Pattern value Valida se a String está no formato da expressão regular passada como parâmetro.
@Range min, max Valida se o valor do atributo (numérico) está entre os valores passados como parâmetro.
@Required - Valida se o campo informado não é vazio.
@Url - Valida se o campo é uma URL com formato válido.

Para aplicar a validação em um objeto de domínio, pode-se usar as seguintes formas:

ValidatorUtil.validateEntity(obj, lista);

ou

ListaMensagens lista = ValidatorUtil.validateEntity(obj);

As mensagens são as mesmas mensagens utilizadas em métodos de validação do ValidatorUtil, de forma que elas possuem um parâmetro que é o nome do campo. Para que seja possível visualizar a mensagem com o nome do campo escrito de forma correta, deve-se utilizar a anotação @FieldName, passando como parâmetro o nome correto do campo. Se o nome do atributo for igual ao nome do campo, a anotação é desnecessária. Exemplos: o atributo notaFiscal é convertido automaticamente em Nota Fiscal, mas o atributo mediaFinal é convertido em Media Final, necessitando da anotação para colocar o acento.

O AbstractControllerCadastro está adaptado para suportar a validação por anotações.

Exemplo de Uso

public class DominioExemplo {
 
   @Range(min="0", max="10") 
   @FieldName("Atributo 1")
   private int attr1;
 
   @Required @FieldName("Atributo 2")
   private String attr2;
 
   @Email @FieldName("Atributo 3")
   private String attr3;
 
   @Url @FieldName("Atributo 4")
   private String attr4;
 
   @Min("1.5") @FieldName("Atributo 6")
   private double attr5;
 
   @Future @FieldName("Atributo 7")
   private Date attr6;
 
   @Length(min="10") @FieldName("Atributo 8")
   private String attr7;
 
   // ...
}

Implementação

As anotações são criadas no pacote br.ufrn.arq.negocio.validacao.annotations, tendo como target “FIELD” e retention policy “RUNTIME”. A regras de validação para cada anotação estão contidas na classe AnnotationValidator, com métodos cujos nomes seguem o padrão validateNomeAnnotation(), onde NomeAnnotation é o nome da annotation cuja regra de validação está sendo implementada.

A classe AnnotationValidator estende AnnotationValidatorSupport, que contém métodos auxiliares para a validação, entre eles, o método validate(), que chama todos os métodos de validação disponíveis. A classe ValidatorUtil, com o método validateEntity() simplesmente chama o método validate() de AnnotationValidator.

Testes

Os testes unitários relativos a validação por anotações encontram-se na classe AnnotationValidatorTests, no pacote br.ufrn.arq.negocio.validacao.tests. Quaisquer novas anotações que forem criadas devem ser testadas nessa classe.