--- title: Validação --- # Validação com Bean Validation! O VRaptor possui validação com o Bean Validation. Basta você anotar seu modelo definindo as _constraints_: ~~~ #!java public class Cliente { @NotEmpty @Size(min=10, max=50) private String nome; @Past private Date nascimento; } ~~~ Em seu controller: ~~~ #!java public void cadastrar(@NotNull @Valid Cliente cliente) { // em caso de erros irá redirecionar para a página de formulário validation.onErrorForwardTo(this).formulario(); } ~~~ ##Dependências Para ativar a validação é necessário ter no _classpath_ alguma implementação para o Bean Validator. Se você estiver usando um _servidor de aplicações_ como Wildfly ou Glassfish, você não precisa adicionar nenhuma dependência. Porém se você usar apenas um _servlet container_, é necessário adicionar o Hibernate validator em seu projeto maven, basta incluir no _classpath_ o artefato: ~~~ #!xml org.hibernate hibernate-validator-cdi 5.0.1.Final ~~~ É necessário também indicar ao CDI para não validar os métodos automaticamente. Para isso adicione o arquivo META-INF/validation.xml com o segunte conteúdo: ~~~ #!xml ~~~ ##Criando validações customizadas Com o Bean Validator você pode criar anotações com suas validações customizadas. Se você quer, por exemplo, validar se o login de um usuário já está em uso, basta criar o código abaixo: ~~~ #!java @Target({ ElementType.PARAMETER }) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = { LoginAvailableValidator.class }) @Documented public @interface LoginAvailable { String message() default "{login_already_exists}"; Class[] groups() default {}; Class[] payload() default {}; } ~~~ E agora o `LoginAvailableValidator` que fará a validação: ~~~ #!java public class LoginAvailableValidator implements ConstraintValidator { @Inject private UserDao userDao; public boolean isValid(User user, ConstraintValidatorContext context) { return !userDao.containsUserWithLogin(user.getLogin()); } } ~~~ Note no código que é possível injetar qualquer componente gerenciável pelo CDI, que pode ser uma DAO ou qualquer outro componente. ##Redirecionando em caso de erro Quando ocorre um erro de validação, você pode redirecionar o usuário para qualquer outra tela. Abaixo alguns exemplos: ~~~ #!java validator.onErrorForwardTo(MusicController.class).list() ==> validator.onErrorUse(logic()).forwardTo(MusicController.class).list(); validator.onErrorRedirectTo(MusicController.class).list() ==> validator.onErrorUse(logic()).redirectTo(MusicController.class).list(); validator.onErrorUsePageOf(MusicController.class).list() ==> validator.onErrorUse(page()).of(MusicController.class).list(); validator.onErrorSendBadRequest() ==> validator.onErrorUse(status()).badRequest(errors); ~~~ Além disso, se o redirecionamento é para um método do mesmo controller, podemos usar: ~~~ #!java validator.onErrorForwardTo(this).list() ==> validator.onErrorUse(logic()).forwardTo(this.getClass()).list(); validator.onErrorRedirectTo(this).list() ==> validator.onErrorUse(logic()).redirectTo(this.getClass()).list(); validator.onErrorUsePageOf(this).list() ==> validator.onErrorUse(page()).of(this.getClass()).list(); ~~~ ##Mostrando os erros de validação no JSP Quando existem erros de validação, o VRaptor coloca um atributo na requisição chamado errors contendo a lista de erros, então você pode mostrá-los na sua JSP de um jeito parecido com: ~~~ #!xml ${error.category} - ${error.message}
~~~ Você também pode buscar por um erro somente de uma determinada categoria: ~~~ #!xml ${errors.asMap().title} // retorna a mensagem para o campo title ~~~