[resolvido] Problema Hibernate Validator

leonardoprc, como eu te expliquei logo acima, você não precisará desse código se usar Eclipselink, pois ele já faz isso para você antes de salvar as entidades. Basta anotar suas entidades e quando você salva o próprio Eclipselink dispara a validação.

Esse código para trabalhar manualmente com o ValidatorFactory é para quando você quer escrever alguma API ou implementar isso manualmente, como foi no meu caso de implementar no vraptor3. O caso do groh foi semelhante, pois ele queria usar os validadores em uma aplicação swing sem uso de Hibernate nem Eclipselink.

Veja bem garcia-jj,

Eu não posso permitir que a aplicação que é em GWT exiba um exception indescritível pro usuário. Então como eu disse acima, preciso REALMENTE interceptar, e antes do persist, exibir de forma amigável, entendeu?

  • A minha questão agora é: Por que o “constraintViolations = validator.validate(usuario)” não está retornando o set de violações?!!!

Mas é isso que o Eclipselink faz, ele chama essas validações antes de persistir. Acho que você que não está entendendo como funciona o Bean Validation.

Hmm, dificil dizer. Se houver alguma violação de constraint ele deveria mostrar o valor maior que 0. Notei que na sua entidade não há nenhuma anotação do Bean Validation. Vocẽ deve anotar seus beans com as constraints em javax.validation.constraints, exemplo, @NotNull.

public class User { @NotNull private Long age; }

[quote=garcia-jj]
Hmm, dificil dizer. Se houver alguma violação de constraint ele deveria mostrar o valor maior que 0. Notei que na sua entidade não há nenhuma anotação do Bean Validation. Vocẽ deve anotar seus beans com as constraints em javax.validation.constraints, exemplo, @NotNull.

public class User { @NotNull private Long age; }[/quote]

Então pronto Dr… Agora vc explicou!!! Tudo indica que é mesmo a anotação. Eu pensei que o BeanValidator se valia das annotations comuns JPA “nullable = false”, o que é nítido que não. Então o BeanValidation contém sua própria coleção de annotations?! Por que não foi unificada com a própria JPA??? Vc tem um link com a lista delas?

O link que eu te mandei logo acima, do Emmanuel Bernard, possui toda a documentação sobre o Bean Validation: http://people.redhat.com/~ebernard/validation/

Bean Validation é uma API standalone, sem vínculo algum com qualquer camada, ou seja, você pode usar tanto na persistência como em algum outro local, como no caso do Vraptor que foi criado um componente que faz a validação no controller.

Ela possui suas próprias anotações, mas você pode criar também as suas. Há um post no blog da Caelum sobre o Bean Validation (em português): http://blog.caelum.com.br/2010/02/03/java-ee-6-comecando-com-bean-validation/

Mas aconselho você a ler o link do Emmanuel que te mandei, pois lá fala-se tudo sobre o Bean Validation.

Abraços

Valeu nobre colega, funcionou perfeitamente!!! 100%

Muito grato por sua dedicação.

Vamos lá, vou desenterrar esse tópico.

Você conseguiu rodar o Bean Validation com Eclipselink? Fiz uns testes aqui em um dos meus projetos que futuramente deverá usar Toplink. Então tudo funcionou bem na transição JPA+Hibernate para JPA+Eclipselink, porém as validações pararam de funcionar.

No Hibernate não é necessário registrar os listeners porque ele faz isso automatico. Como o Eclipselink faz? Preciso adicionar os listeners manualmente nos eventos?

[quote=garcia-jj] (…)
No Hibernate não é necessário registrar os listeners porque ele faz isso automatico. Como o Eclipselink faz? Preciso adicionar os listeners manualmente nos eventos?[/quote]

Vejamos… Primeiro me explique direitinho também na prática o que vem a ser “adicionar os listeners…”

[quote=leonardoprc][quote=garcia-jj] (…)
No Hibernate não é necessário registrar os listeners porque ele faz isso automatico. Como o Eclipselink faz? Preciso adicionar os listeners manualmente nos eventos?[/quote]

Vejamos… Primeiro me explique direitinho também na prática o que vem a ser “adicionar os listeners…”[/quote]

O JPA possui eventos pre-persist, pre-remove, pre-update conforme a ação que você precisa fazer. Quando você usa Hibernate como provider de JPA e também o Hibernate Validator como provider da JSR303 ambos se entendem e adicionam automaticamente nesses eventos as chamadas ao Hibernate Validator, fazendo com que sempre que você incluir um objeto (pre-persist) ou quando você salva um objeto (pre-update) ele chame a validação.

Ainda não terminei de ler a documentação do Eclipselink, deve ter alguma coisa referenciando a esses eventos.

quote=garcia-jj
sempre que você incluir um objeto (pre-persist) ou quando você salva um objeto (pre-update) ele chame a validação.
Ainda não terminei de ler a documentação do Eclipselink, deve ter alguma coisa referenciando a esses eventos.[/quote]

Hummm… faz tempo que você referencia esses eventos (listeners) e eu bóio. Agora entendí, porém na minha implementação eu não me apoiava neles não. Seguinte: O meu BaseDao é que antes da persistência realiza e evoca manualmente o factory validator. Assim:

        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        Validator validator = factory.getValidator();
        Set<ConstraintViolation<BaseBean>> constraintViolation = validator.validate(baseBean);
        (...)

E depois percorro toda a collection de erros exibindo amigavelmente em português claro para o usuário. Se eu não tiver conseguido me fazer entender é só falar!!!