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:
Se você tiver com dúvidas referente à validação com VRaptor, por favor lê esse tutorial primeiro.
Abre o seu arquivo vraptor.xml e registre o plugin:
<vraptor>
...
<plugin>org.vraptor.plugin.hibernate.HibernateValidatorPlugin</plugin>
...
<vraptor>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.
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.
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.
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.
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.