quinta-feira, 3 de maio de 2012

JSR 303 Bean validator e Hibernate validator Parte 1

Digamos que você gostaria de validar um dado que o usuario digitou, validar um CPF se o campo é nulo, você pode fazer no inicio do metodo algo como

if(cliente.cnpj == null, cliente.nome == null){
   throw new Exception("Preencha os campos obrigatórios");
}

Ira funcionar? Sim, ou talvez não do jeito que você planejou, e se eu quiser saber se o cnpj tem o tamanho exato, ou se ele é valido, pois podem existir outra dezenas de validações para um campo e imagina o trabalho que iria dar colocar todas a validações todas as vezes em cada metodo, não iríamos criar um metodo e sim um monstro.
Para simplificar isso foi criado e aprovado o JSR 303 ou Bean validator.

Bean validator também conhecido como JSR 303 foi uma especificação aprovada no final de 2009 pela JCP (Java community process) e faz parte do JavaEE 6, segundo a propria especificação ela faz o seguinte.

CUIDADO CONTEUDO ALTAMENTE TEÓRICO

“This JSR defines a metadata model and API for JavaBean validation. The default metadata source is annotations, with the ability to override and extend the meta-data through the use of XML validation descriptors.
The validation API developed by this JSR is not intended for use in any one tier or programming model. It is specifically not tied to either the web tier or the persistence tier, and is available for both server-side application programming, as well as rich client Swing application developers.” – JSR-303 Specification

Tradução livre feita pelo autor

Essa JSR define um modelo de matadados e API para validar o JavaBean. O matadado padrão é a anotação, tem que a habilidade de sobrescrever e estender o metadado através do uso de validação XML.
A API de validação desenvolvida por essa JRS não tem a intenção de uso em nenhuma camada ou modelo de programação. Ela não esta atrelada a nenhuma camada web ou camada de persistencia, e esta disponível tanto para aplicação do lado servidor como para desenvolvedores que utilizam Swing.

Agora você me pergunta ótimo mais como eu faço para usar essa tal de jsr 303, quero validar meus campos. Para isso você não ira precisar ficar criando validações uma a uma, ja existe implementações dessa JSR, o mais famoso e utilizado e o Hibernate validator, para utilizá-lo basta baixar o arquivo e utilizar os seguintes jars

Hibernate-validator-xxx.jar
Validation-api-xxx.jar
Jboss-logging-xxx.jar

Com isso você já esta pronto para utilizar o bean validator.
Crie uma classe chamada Cliente com os seguintes campos id, nome, email e em cima delas utilizar a anotação @NotNull @Size @Email todas do pacote.

public class Cliente {

@NotNull(message="Valor não pode ser nulo")
private Integer id;

@Size(min=5, message="Tamanho deve ser maior que 5")
@NotNull(message="Nome não pode ser nulo")
private String nome;

@Email(message="Email invalido")
private String email;

//getters and setters

}

Note que para todas as anotações existe um atributo chamado message, que é a mensagem que sera passada caso o campo não seja validado.
Agora vamos criar um cliente console para mostrar a validação em funcionamento.


public class Client {

 public static void main(String[] args) {
  //Nome menor que 5, email invalido
  Cliente cliente = new Cliente(1, "Cris", "adminqwdadmin.com");
  
  ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        Validator validator = factory.getValidator();
  Set<constraintviolation<Cliente> constraintViolations = validator.validate(cliente);
  for(ConstraintViolation error : constraintViolations){
   System.out.println(error.getMessage());
  }
 }
}

Retorno no console


É isso, espero que tenham gostado, essa foi apenas a primeira parte sobre Hibernate validator, o proximo post sera como integralo com Spring e utilizado em um formulario HTML.


Parte 2