====== 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.