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