Hibernate Validator Plugin

VRaptor2 oferece um plugin que usa o hibernate validator para verificar automaticamente as suas lógicas de negócios.

Para usar o Plugin temos que fazer os seguintes passos:

  1. Registra o plugin no arquivo vraptor.xml
  2. Aplica as anotações do hibernate validator no seu modelo
  3. Aplica a anotação @Validate na lógica
  4. Busca os erros

    Se você tiver com dúvidas referente à validação com VRaptor, por favor lê esse tutorial primeiro.

vraptor.xml

Abre o seu arquivo vraptor.xml e registre o plugin:

<vraptor>
        ...
        <plugin>org.vraptor.plugin.hibernate.HibernateValidatorPlugin</plugin>
        ...
<vraptor>

Anotações do Hibernate Validator

Basicamente você aplica as anotações como:

@Entity
public class User {

        @Id
        @GeneratedValue
        private Long id;

        //use validation annotations!
        @Length(min=3,max=100)
        private String name;
        
        @Email
        private String email;
        
        @Min(5)
        private String password;
        
        //getters and setters
}

O exemplo é bem simples e usa @Email, @Min e @Length para anotar as regras de validação. O nome do usuário deve ter entre 3 and 100 caracteres, o email deve ser valido e a senha deve ter pelo menos 3 caracteres.

Tem muito mais anotações ... por favor veja a documentação.

O lógica de negócios

Agora que nós já implementamos as regras de validação, temos que avisar o VRaptor onde/quando ele deve aplicar elas.

Vamos ver um exemplo:

@Component("user")
public class NewUser {

        @Parameter 
        private User user = new User();

        //user should be validated automatically
        @Validate(fields={"user.name","user.email"})
        public void add() {
                //add user to database
        }
}

@Validate é uma das anotação do VRaptor e pertence um parâmetro. O parâmetro fields indica quais são os campos do objeto user para validar ANTES do método add() será executado.

VRaptor embrulha (wrap) o método e valida os campos user.name e user.email usando o hibernate validator.

Observe que nós não verificamos o campo password mesmo sendo anotado com @Min() no modelo User.

Se quiser validar o user inteiro, você poderia escrever:

        ...
        @Validate(fields={"user.name", "user.email", "user.password"}). 
        public void add() {
                //add user to database
        }
        ...

Mas para um modelo com muitos atributos fica trabalhoso. Por isso existe uma maneira mais fácil. Veja a classe da lógica um pouco modificada:

@Component("user")
public class NewUser {

        @Parameter 
        @Valid
        private User user = new User();

        @Validate(fields={"user"})
        public void add() {
                //add user to database
        }
}

Usamos uma outra anotação do Hibernate, @Valid, usada no atributo user. Agora VRaptor sabe que você quer validar o objeto inteiro e basta indicar o nome do objeto: @Validate(fields="user"). Pronto ... VRaptor vai validar todos os atributos do user.

user/add.invalid.jsp

Se um erro acontecer, VRaptor redirecionará ao user.add.invalid (e como você já sabe :) pelo menos uma mensagem será adicionada nos ValidationErros O método add() somente será executado, se nenhum erro de validação acontecer. Isso não difere da validação com o método validateAdd().

Imprime os erros ... por exemplo:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
Erros de validação:
<div id="errors">
<ul>
        <c:forEach var="error" items="${errors.iterator}">
                <li>${error.key}</li>
        </c:forEach>
</ul>
</div>
</html>

Em caso de erros a variável errors é ejetada automaticamente.

Validando parâmetros de nossa lógica

Você também pode validar seus parâmetros usando a anotação @Validate:

        public static class PersonParamLogic {

                @Validate(params = { "person.id1" })
                public void partial(Person p) {

                }

                @Validate(params = { "person" })
                public void complete(Person p) {

                }
        }

Tome cuidado, o nome do parâmetro a ser validado é o nome do tipo do parâmetro, e não o nome real da variável.

Conclusão

Usando o hibernate validator combinado com o plugin do VRaptor é muito simples e poderoso. A validação é totalmente baseado nas anotações. Você não precisa escrever uma linha de código de validação. Ele já foi escrito por você milhares de vezes. Só avisa o que é para validar e não como.