[Resolvido] Anotação @Validate na validação de CPF - Stella Caelum
34 respostas
G
Guevara
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.
G
Guevara
Então, já dei refresh e reiniciei o Tomcat, adicionei o jar ao buildpath e continua mandando configurar lá. =)
G
garcia-jj
Vai lá no buildpath então e você se tem algum erro ou warning.
G
Guevara
Está acusando pra configurar o BuilPath e esta mensagem:
G
garcia-jj
Tem que ter o jar do bean validation. No vraptor tem esses jars em lib/optional/validation-api-1.0.0.GA.jar
root cause
javax.validation.ValidationException: Unable to find a default provider
javax.validation.Validation$GenericBootstrapImpl.configure(Validation.java:264)
Têm que fazer algo mais??
Abraço!
G
garcia-jj
O ideal é pegar os jars que tem no próprio vraptor.
Se você não está em um appserver com JEE6 você precisa também do Hibernate Validator 4x (tem tudo no vraptor/lib)
G
Guevara
Vou baixar o último VRaptor de novo, pq no que eu tenho não existe esse jar dentro da /lib/optional.
guenta ai…
G
Guevara
Agora sim, preenchi o form e tenho este erro agora:
Preciso anotar o método do Controller com @ Valid?
import javax.validation.Valid;
Abraço!
G
Guevara
Consegui inserir um proprietario com a anotação:
@CPF(formatted=true,message="erro no cpf")privateStringcpf;
Mas como faço pra essa msg aparecer na jsp? É assim que usa essa anotação pra validar?
G
garcia-jj
Madrugando, é? Hehehe.
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.
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!!
obs: o Java tá dominando as madrugadas. :lol:
G
Guevara
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:
Esse “format” que eu não sei se está certo.
Abraço!
G
Guevara
É só o Garcia que têm a documentação desse js303-br.jar?
Abraço!!
G
garcia-jj
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á [CPF removido] 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.
Deixei apenas as mensagens, e coloquei no formato que vc passou. Mesmo assim diz que o cpf e os telefones estão incorretos.
G
garcia-jj
O padrão para formatted é FALSE, ou seja, se o CPF que você está passando é formatado você precisa colocar formatted=true.
G
Guevara
Pois é Garcia, eu fiz isso tb, passei o CPF como [CPF removido] e como [telefone removido], mesmo assim não valida.
O telefone parece que é validado com o formato [telefone removido] e não como 21.2547.4455.
G
garcia-jj
Guevara, alguma coisa está errada aí. Note a classe de teste que tenho no projeto para validar se o CPF está correto:
public class Cliente {
@CPF(formatted = true)
public String cpf1;
}
G
Guevara
Agora entendi, deu boa, a validação faz o cálculo mesmo para saber se é válido ou não: http://www.profcardy.com/artigos/cpf.php
Para alterar o formato do telefone para “21-9999-9999” eu não tô conseguindo:
Oi Guevara. Como eu tinha te dito no outro post você deve usar expressões regulares. Vou ver se essa semana melhoro a documentação dele.
Abraços
G
Guevara
Valeu Garcia!
Quando sair a documentação avise que eu vou baixar. =)
Esta validação ficou bem legal, tava pensando se seria possível fazer a validação para valores, anotar um atributo BigDecimal por exemplo. O problema seria o banco, pq o Hibernate cria a coluna como numeric(19,2) o valor fica assim 1504.00, ao invés de 1.504,00, pior ainda usando máscara no input. hehe
Abraço!!
G
garcia-jj
Guevara, BigDecimal é sempre 1504.00 e não 1504,00. Quando você enxerga com virgulas isso é na verdade apenas uma representação do objeto formatado, mas não o objeto valor em sí. Se você quiser validar um valor como 1504,00 o seu campo precisa ser uma String ao invés de BigDecimal.
Vai mandar com ponto e vírgula, ai não dá pra salvar no banco. Eu tava pensando em alguma anotação que retirasse o ponto do milhar e a virgula do decimal, colocando o ponto no lugar, isso poderia ser feito por anotação tb, senão vou ter que criar um método usando replace para formatar o valor corretamente antes de ser persistido.
Tenho até outro tópico sobre isso. http://www.guj.com.br/posts/list/217654.java
Abraço
G
garcia-jj
Guevara, você pode usar uma regex no próprio Bean Validator anotando a propriedade com @Regex e passando uma expressão regular que faça o trabalho.
Abraços
G
Guevara
Oi Garcia!
Tô passando pra postar a solução:
Colocar no web.xml:
Vi essa dica postada pelo Lucas em outro tópico.
Agora sim, posso usar a máscara JQuery para valores, ao digitar o valor ele é convertido de 2.500,00 para 2500.00, no formato que o banco espera receber.
Abraço!!
G
garcia-jj
Ahh, agora eu entendi o que você queria, hehe
Abraços
D
Diego_Adriano
Guevara, como vc conseguiu resolver o problema do “javax.validation.ConstraintViolationException” a que se refere isso ?
Abraços