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. |
- | 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.
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; // ... }
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
.
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.