terça-feira, 5 de agosto de 2014

Hibernate Validator

Que coisa linda é a implementação da JSR-303 !
Esse tal de Hibernate Validator, é muito foda!! Sabe-se lá quantos IF's ele pode evitar que vocês precise escrever, bastando definir annotations para validação dos atributos de sua classe.
A sensação de usar hibernate Validator no meu projeto é mais ou menos assim:

Gastando menos tempo com IF's de validações me sobra mais tempo para tomar cerveja, então vamos ver como implementar uma validação de 'caba homi', porque escrevendo menos aqui, já sabem! Sobra mais tempo para cervejas.

Na classe Receita, eu preciso validar  a quantidade de caracteres de um atributo, e se um outro é nullo. Então defini as constraints  através do annotation @Size, com o valor min, max ,mensagem da validação e @NotEmpty somente com a mensagem.

package com.blogspot.receitastecnologicas.entidade;

import javax.validation.constraints.Size;
import org.hibernate.validator.constraints.NotEmpty;

/**
 *
 * @author receitas tecnologicas
 */
public class Receita {

    @Size(min = 10, max = 255, message = "A descrição da receita deve conter entre 10 e 255 caracteres")
    private String descricao;
    @NotEmpty(message = "Informe o autor!!")
    private String autor;

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.receita = receita;
    }

    public String getAutor() {
        return autor;
    }

    public void setAutor(String autor) {
        this.autor = autor;
    }

}

Agora vamos criar a classe de validação.

No meu objeto a ser validado, vou setar 5 caracters e nullo em seus atributos e depois submete-lo a validação das constraints usando uma instância de Validator.
O Validator retorna um conjunto de ConstraintViolantion (ou vazio, caso não viole nenhuma restrição), que será iterado a fim de exibir os erros . Como estou validando se A descrição da receita deve conter entre 10 e 255 caracteres e se o autor não é nulo, será printado o seguinte texto:
run:
3 [main] INFO org.hibernate.validator.util.Version - Hibernate Validator 4.0.2.GA
-----Erros --------
Campo: autor - ERRO-> Informe o autor!!
Campo: descricao - ERRO-> A descrição da receita deve conter entre 10 e 255 caracteres
CONSTRUÍDO COM SUCESSO (tempo total: 0 segundos)


package com.blogspot.receitastecnologicas;

import com.blogspot.receitastecnologicas.entidade.Receita;
import java.util.Set;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;

/**
 *
 * @author receitas tecnologicas
 */
public class HibernateValidator {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        try {

            ValidatorFactory factory
                    = Validation.buildDefaultValidatorFactory();
            Validator validator = factory.getValidator();
            //Objeto a ser validado
            Receita receita = new Receita();
            receita.setDescricao("Farofa");//texto com 5 caracteres
            receita.setAutor(null);
//            receita.setDescricao("Bode assado na brasa com macaxeira frita");
//            receita.setAutor("Ojuara");

            //Validating the object and getting the result
            Set<ConstraintViolation<Receita>> constraintViolations = validator.validate(receita);
            if (constraintViolations.size() > 0) {
                System.out.println("-----Erros --------");
            }
            //printing the results
            for (ConstraintViolation<Receita> constraintViolation : constraintViolations) {
                System.out.println("Campo: " + constraintViolation.getPropertyPath() + " - ERRO-> "
                        + constraintViolation.getMessage());
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

Mais detalhes http://hibernate.org/validator/documentation/getting-started/