[resolvido] Problema Hibernate Validator

Pessoal, estou acoplando Hibernate Validator no meu projeto, na minha Classe Cliente adicionei todas as Constraints e na minha GUI, nas hora de o usuário clicar em “Salvar” chamo o seguinte código:

ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); Validator validator = factory.getValidator(); Set<ConstraintViolation<Kunde>> constraintViolations = validator.validate(objKunde);

Porém recebo o seguinte erro:

Absent Code attribute in method that is not native or abstract in class file javax/validation/Validation

As minhas referencias sao as seguintes:

import java.util.Set; import javax.validation.ConstraintViolation; import javax.validation.Validation; import javax.validation.Validator; import javax.validation.ValidatorFactory;

Nao sei mais o que fazer, estou usando NetBeans e ja estou comecando achar que nao vale a pena usar esse tipo de validacao (fácil falar pra quem está comecando em Java), mas nao creio que posso ser tao complicado assim. Além disso, nao acho nenhum exemplo descente na Internet. As vezes acho algo, mas sempre imcompleto, nao falando de ode sao as referencias e etc, ai acabo nao sabendo o que puxar no meu import e etc…

Agradeceria se pudessem me ajudar!

Abracos

Estranho, eu faço essa validação assim:

ClassValidator validator = new ClassValidator(entity.getClass());
InvalidValue[] invalidValues = validator.getInvalidValues(entity);

Tente assim. Se não funcionar, passe a versão do HV que você está usando…

[]´s

o NetBeans pede pra eu criar a Classe ClassValidator porque ela nao pode ser importada, de qual package/jar é essa classe?

Estou usando o hibernate-validator-4.0.2.GA

No meu NetBeans Library tenho as seguintes Libraries referenciadas no meu Projeto:

  • Java EE 6 API Library
  • MySQL JDBC Driver
  • hibernate-validator-4.0.2.GA (.jar file)
  • hibernate-validator-4.0.2.GA (/lib directory)

Estou com a impressao que é algum problema com as referencias ou com o NetBeans???

O nome completo da classe é org.hibernate.validator.ClassValidator (estou usando o HV 3.0.0)

[]´s

pra mim nao aparece a classe ClassValidator, somente HibernateValidator em org.hibernate.validator

vou tentar entao com a 3.0 e vejo no que da!

abs

Todas as classes estão dentro do javax.validation. No outro tópico eu falei para você colocar o jar do Bean Validator. Ele vem junto com o download do Hibernate Validator 4, porém não lembro de cabeça o nome.

mas eu ja fiz isso, o jar esta la e essas sao minhas referencias:

import java.util.Set; import javax.validation.ConstraintViolation; import javax.validation.Validation; import javax.validation.Validator; import javax.validation.ValidatorFactory;

Estou com a versao mais atual do HV, ja tentei com 3.0 e nada também :cry:

Talvez vou reiniciar o computador, desistalar o netbeans e instalar de novo =/

Ele da erro logo no primeiro comando ValidatorFactory

Pode ter alguma coisa a ver com a configuracao do mez jdk etc?

Se você tem o JEE 6 Library as classes devem estar já no seu classpath, pois o bean-validation e o hibernate-validator estão já por lá.

Estou achando muito estranho esse seu erro, nunca tinha visto isso antes. Anexe aqui sua classe que está dando erro, se puder.

bom, primeiro o erro em exception:

[quote]run:
Exception in thread “AWT-EventQueue-0” java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
at org.hibernate.validator.util.LoggerFactory.make(LoggerFactory.java:29)
at org.hibernate.validator.util.Version.(Version.java:30)
at org.hibernate.validator.engine.ConfigurationImpl.(ConfigurationImpl.java:52)
at org.hibernate.validator.HibernateValidator.createGenericConfiguration(HibernateValidator.java:43)
at javax.validation.Validation$GenericBootstrapImpl.configure(Validation.java:269)
at javax.validation.Validation.buildDefaultValidatorFactory(Validation.java:111)
at GUI.GuiKunde.(GuiKunde.java:53)
at GUI.GuiKunde$5.run(GuiKunde.java:467)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
… 16 more[/quote]

agora o código

[code] /** Creates new form GuiMain */
public GuiKunde() {

    /*TEST BEREICH*/
    //
    try{
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        Validator validator = factory.getValidator();
        Set<ConstraintViolation<Kunde>> constraintViolations = validator.validate(null);
    }catch(Exception ex){
        Console.println(ex.getMessage());
    }
    //[/code]

o erro acontece mesmo nessa linha: [color=darkblue]ValidatorFactory factory = Validation.buildDefaultValidatorFactory();[/color]

Estou horas no Google tentando ver o que pdoe ser. Pelo que estou lendo agora, pode ser algo com NetBeans, nao tenho certeza! preciso ler direito…

groh, o Hibernate validator possui umas depenências. A dependência que ele precisa é o slf4j que você pode encontrar no site www.slf4j.org e normalmente ela é distribuído no próprio download do Hibernate Validator. Acho que você não prestou atenção nisso.

Baixe esse slf4j e copie os jars slf4j-api-1.6.0.jar e slf4j-jdk14-1.6.0.jar. Em resumo isso é uma API de logging que o Hibernate e seus projetos filhos usam. Infelizmente não sei porque eles não usam o logging do próprio Java :roll: .

Acho que agora com esses dois jars você não terá mais erros. Qualquer coisa, avise.

Olha, ta vendo esse diretório lib? Todo esse diretório esta no meu projeto adicionado a minha Library junto com o hibernate-validator-4.0.2.GA.jar

mas entao ao invés de adicionar a pasta, vou adicionar jar por jar e ver se funciona, que nem eu fiz com a validation-api-1.0.0.GA

olha ai, funcionasse!

adicionei simplismente todos os jars na unha. pensei que se eu referenciasse somente o diretório isso funcionario. se nao me engano com eclipse funciona!!! :roll:

obrigado…daqui a pouco apareco aqui de novo pra postar os próximos erros hahaha

estou bem contente com o fórum e agora nao estou odiando mais java tanto assim :lol:

groh, você veio do c#, certo? Vou tentar de dar uma opinião tentando ser imparcial, afinal não vale a pena entrar naquela discução infinita de .net X java.

Mas como você veio de uma linguagem é normal você tentar fazer tudo como fazia nela, e como não é igual no inicio você achar que Java é ruim. Mas conforme você ir se acostumando vai notar o quão bom é Java.

Eu programei em aproximadamente 3 anos em perl, depois lá por volta de 1996 comecei a programar em Java. No início eu achei tudo compliado, mas logo me acostumei e acabei me dedicando até hoje somente com Java.

Bem vindo :thumbup:

Sim, esse é o problema de programar um bom tempo uma linguagem e dai ja dar de cara com uma outra e de cara ja querendo comecar com Beans Validators, etc etc…

Eu tenho nocao de que Java é uma línguagem ótima, mas enquanto eu nao me acostumar, é aquilo né…

A Syntaxe é a mesma, mas a idéia é diferente, o modo de trabalhar é diferente e estou percebendo o seguinte; conseguiria aplicar o modo de trabalhar com Java em C# mas nao o contrário. Acho que Java da uma visao mais ampla de programacao em geral, por nao dar tudo mastigado que nem a Microsoft…estou percebendo que com Java o buraco é mais embaixo! Mas estou gostando…preciso agora me apegar nos termos e etc…

Obrigado pela Ajuda…o Validator esta funcionado muito bem!

Abracos ea té a próxima!

Olá Pessoas, olá Garcia,

Me deparei aqui com a uma implementação de Dao genérico que faz validações de beans. Então lí num post que vc participa em http://www.guj.com.br/posts/list/15/147071.java#794215 que o BV agora é RI do JPA. Fiquei muito feliz pois eu não adoto o Hibernate, e sempre uso o EclipseLink.

Então estou pressupondo que posso usar o BV com o EL. Acontece que quando adicionei e olhei dentro do bean-validator.jar (jar pescado do Glassfish) ele não possui a classe ClassValidator.

  • Estou no caminho certo? Vou poder usar BV com o EL, TL, etc?!!!

leonardoprc, não entendi muito bem sua pergunta.

Na verdade o Bean Validation é apenas a especificação, e de qualquer forma você ainda vai precisar de uma implementação, que pode ser o Hibernate Validator 4 ou algum outro. Não lembro se há alguma outra implementação da JSR303 (Bean Validation), conheço apenas o Hibernate Validator 4.

EL você quer dizer Expression language? EL é algo para você imprimir na tela as propriedades de um Bean, já o Bean Validation você valida algum bean antes de salvar. Não entendi a relaçaõ.

O bean-validator.jar do glassfish possui dentro dele as classes da JSR303 e também o Hibernate Validator. Eu tenho usado ele com o Hibernate 3.5 apenas. Para usar-lo você deve chamar algo assim:

ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); Validator validator = factory.getValidator(); Set<ConstraintViolation<Kunde>> constraintViolations = validator.validate(meuObjeto);

Muito grato, e desculpe-me… É que vejo vocês por aqui abreviar, e como eu já havia me referenciado (EclipseLink) achei que seria sugerível “EL”.

Então estou querendo usar Bean Validator com o EclipseLink, mas não sei onde encontrar a implementação do Bean-Validator dele. Achei que estaria no próprio jar bean-validator.jar. Ocorre que não existe a classe ClassValidator no bean-validator.jar. Minha implementação é algo assim:

    ClassValidator<MyEntity> classValidator = new ClassValidator<MyEntity>((Class<MyEntity>) myEntity.getClass());
    InvalidValue[] invalidValues = classValidator.getInvalidValues(myEntity);
    String atributo = invalidValues[0].getPropertyName());

Há uma documentação muito boa da especificação da JSR303 pelo Emmanuel Bernard, o “chefe” da especificação: http://people.redhat.com/~ebernard/validation/. Nessa documentação mostra até mesmo como implementar componentes customizados e tudo mais. Ou seja, o Emmanuel dissecou a especificação nesse documento, já que foi ele mesmo que fez a spec, haha.

Há algumas semanas eu implementei o uso do Bean Validation no Vraptor 3, você pode encontrar meus commits aqui, que podem te ajudar um pouco a entender como funciona: http://github.com/garcia-jj/vraptor/commit/ad6f9215604cc4f09af4e385ae757b13c0d25094

Só tem um porém… o que você realmente quer fazer com o Bean Validation: usar ou montar sua própria factory? Porque se você usa o Eclipselink vocẽ não precisa implementar nada. No Hibernate basta você adicionar o listener do Bean Validation que quando sua entidade for salva o Hibernate chama a validação automatica, sem você precisar usar nada manual, basta apenas anotar seus beans.

Creio que o Eclipselink seja assim também. Dê uma olhada na documentação do Eclipselink para ver como usar a JSR303 nele.

Mas se você quer mesmo criar uma factory manual para fazer a validação manual, aí você pode seguir o mesmo caminho que eu fiz no Vraptor.

Deixa eu apenas fazer uma pergunta, já que conheço pouco do Eclipselink. Porque você optou por usar ele ao invés do Hibernate?

Abraços

Nunca gostei do Hibernate. Sei que ele tem suas 1.000.000.1 utilidades e recursos pra dar em doido. E sem entrar pelo mérito da questão acho ele pesado. E prefiro ficar mais próximo do JPA e até do JDO. Prefiro as implementações como EclipseLink, TopLink, OpenJPA e até JPA puro. Me sinto MAIS LIVRE, menos aprisionado!!!

Agora, quanto a minha implementação: Realmente eu não quero reinventar a roda. Se existe um caminho menos doloroso, prefiro seguir. Vou examinar o material que vc postou.

Bom, eu não sei exatamente como definir minha implementação. Mas tenho um POJO assim:

@Entity()
public class Usuario implements Serializable {
(...)
    @Column(nullable = false, length = 40)
    private String nome;

Antes de persistir, implementei da forma que foi sugerida:

ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); Validator validator = factory.getValidator(); Set<ConstraintViolation<Usuario>> constraintViolations = validator.validate(usuario);

Porém o set constraintViolations.size() é igual a 0 (zero). E ocorre o erro na persistência.

  • Porém eu gostaria de interceptar e de forma mais amigável exibir para o usuário.