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.