Oi pessoal!
Estou seguindo o tutorial (http://stella.caelum.com.br/frameworks-vraptor.html) para validar CPF usando o Stella, mas a anotação @Validate(params = “”) não existe.
Já adicionei os dois jar’s na /lib e dei refresh:
caelum-stella-hibernate-validator-1.2.jar
caelum-stella-core-1.2.jar
Na minha classe está assim:
Mas não valida nada, está gravando com CPF incorreto, achei que poderia ser pela falta do @Validate no método de adicionar o proprietário no Controller:
public void adiciona(final Proprietario proprietario) {
//codigos
}
Estou usando Hibernate 3.5.1, o jar dele está na /lib.
Abraço!! o/
O Stella somente valida usando Hibernate 3 Validator e Vraptor 2, mas não funciona com o Bean Validator, nem com Vraptor 3 e nem com o Hibernate Validator 4.
A alternativa é você criar um componente para fazer essa validação. O Lavieri fez isso e me mandou o jar, porém eu perdi.
Se você quer fazer validações usando o componente de validação do Vraptor 3 você pode usar uma API que eu andei escrevendo e que está no meu github. Devido a falta de tempo não fiz nenhum build, mas vou ver se faço isso agora mesmo, hehe.
Com essa API basta você anotar seu bean com @CPF, @CNPJ e afins, e quando você persistir o objeto ou chamar no Vrator o validation.validate(meuBean) as anotações serão validados.
Opa!! Valeu garcia! Não sabia que pro VRaptor 3 não funcionava, uma pena. =/
Já baixei o seu jar aqui, vou ver como funciona e já dou um retorno.
Abraço!
Quando você adiciona um jar dentro do seu projeto, você precisa dar um refresh na workspace (para sincronizar ela com o filesystem) e também precisa adicionar ao projeto.
Quando você tem um Dynamic Web Project e coloca um jar dentro do WEB-INF/lib o Eclipse automagiamente adiciona esse jar ao classpath, caso contrário precisa ser manual.
root cause
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'JSR303ValidatorFactory': Unsatisfied dependency expressed through constructor argument with index 0 of type [javax.validation.ValidatorFactory]: : Error creating bean with name 'br.com.caelum.vraptor.validator.ValidatorFactoryCreator': FactoryBean threw exception on object creation; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'validatorFactoryCreator': Invocation of init method failed; nested exception is javax.validation.ValidationException: Unable to find a default provider; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'br.com.caelum.vraptor.validator.ValidatorFactoryCreator': FactoryBean threw exception on object creation; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'validatorFactoryCreator': Invocation of init method failed; nested exception is javax.validation.ValidationException: Unable to find a default provider
root cause
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'br.com.caelum.vraptor.validator.ValidatorFactoryCreator': FactoryBean threw exception on object creation; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'validatorFactoryCreator': Invocation of init method failed; nested exception is javax.validation.ValidationException: Unable to find a default provider
org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:150)
root cause
javax.validation.ValidationException: Unable to find a default provider
javax.validation.Validation$GenericBootstrapImpl.configure(Validation.java:264)
Agora sim, preenchi o form e tenho este erro agora:
root cause
javax.validation.ConstraintViolationException: validation failed for classes [br.com.imobiliaria.bean.Proprietario] during persist time for groups [javax.validation.groups.Default, ]
org.hibernate.cfg.beanvalidation.BeanValidationEventListener.validate(BeanValidationEventListener.java:132)
org.hibernate.cfg.beanvalidation.BeanValidationEventListener.onPreInsert(BeanValidationEventListener.java:71)
org.hibernate.action.EntityIdentityInsertAction.preInsert(EntityIdentityInsertAction.java:159)
org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:65)
org.hibernate.engine.ActionQueue.execute(ActionQueue.java:268)
Preciso anotar o método do Controller com @ Valid?
import javax.validation.Valid;
Guevara, basta você anotar a classe POJO com as tuas constraints tanto com as do Bean Validation como dessa API que te passei. Após você anotar a classe o próximo passo é injetar o objeto Validation do Vraptor no seu controller. Nele há um método chamado Validation.validate, que valida teus beans a partir das anotações que você usou.
private final Validator validator;
public CustomerController(Validator validator) {
this.validator = validator;
}
public void store(CustomerDetails customer) {
validator.validate(customer);
validator.onErrorForwardTo(this).edit(customer.getId());
}
}[/code]
A validação é devolvida para você dentro do objeto errors que fica acesível do JSP como ${errors}, esse que você já deve conhecer, que é o padrão do Vraptor. Esse objeto na verdade é um map sendo que o key é o campo com erro e value é a mensagem de validação.
Opa!
Agora sim!
Foi só colocar o validator.validate(proprietario) que funcionou. \o/
O legal é que dá pra validar E-Mail, CEP e CNPJ também.
Valeu Garcia!
Abraço!!
Opa, beleza??
Onde posso achar a documentação das anotações?
Preciso configurar isto direito pq agora não consigo inserir os dados com o que eu tenho anotado:
Oi Guevara. Esse projeto é um projeto pessoal meu, e com a pequena falta de tempo a documentação é curta. Tem os javadocs do projeto, se você usa o Eclipse quando você passa o mouse encima do método o Eclipse já completa a documentação.
Fazendo uma rápida explicação, todas as anotações possuem o campo message que se você deixa em branco ele pega as mensagens padrão. Ou vocẽ pode definir sua própria mensagem como você fez.
O campo formatted significa que o campo é formatado, caso contrário considero o campo como “somente numeros”. No caso um CPF válido será 000.000.000-00 e CNPJ 00.000.000/0000-00. Para CEP é considerado 00000-000 e telefone como 00.0000.0000.
O campo format é uma regex de como você quer que seja o formato válido para o campo. A classe RegexConstants [1] possui as regex usadas no projeto, e você pode se basear nelas para escrever seus próprios formatos.