Interceptando Erro com vRaptor e JPA

Olá,

Alguém poderia me informar como posso recuperar minhas exceções do JPA e exibir-las nas validações? Mais especificamente estou cadastrando um bean no banco que possui validações próprias, como unique, contudo ao tentar salvar um bean com valor repetido recebo uma exception e não sei como recupera-lá para trata-lá e exibi-lá no mesmo formulário de cadastro/atualização. Li na documentação o uso do validator.validate, contudo isso é só é funciona utilizando especificamente o Hibernate.

Desde já,
Obrigado.

o validator.validate funciona com qualquer implementação da especificação Bean Validations…

uma delas é a Hibernate Validator (que se eu não me engano não depende do Hibernate pra funcionar).

o ideal é prevenir essas exceções com validação. Mas se quiser vc pode fazer um try…catch em volta da chamada ao banco e adicionar o erro de validação, ou ainda usar o exceptionHandler do VRaptor

http://vraptor.caelum.com.br/pt/docs/tratamento-de-excecoes/

Lucas,

Utilizando o validator.validate mostra uma exception ao usuário e é justamente isso que eu gostaria de evitar.
Utilizo validações, mas somente para validar os campos, penso que se começar a fazer validações em dois cantos diferentes, como no bean e nas minhas validações de campo, realizar validações no bean seria “meio” que desnecessário, já que eu estaria me repetindo e acredito que isso não seja uma boa prática, contudo, posso estar enganado.
Com o uso do exceptionHandler do Vraptor, como você sugeriu, ainda consigo evitar exibir a exception ao usuário, mas n consigo capturar a exceção para dizer ao usuário qual o erro está ocorrendo.

Obrigado.

qual exception acontece qdo vc usa o validator.validate?

Um exemplo seria, br.com.caelum.vraptor.InterceptionException: exception raised, check root cause for details: javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: ERROR: duplicate key value violates unique constraint …

mas isso não é por causa do validator.validate. É pq vc não validou que a chave que o cara usou já existe no banco… vc precisa fazer isso também.

Lucas,

Eu sei que isso é por causa da chave que está se repetindo no banco, contudo, como eu disse anteriormente, o validator.validate não valida as anotações na Entidade e não diz que a chave no banco está repetida, dispara logo a exceção. O que gostaria de fazer é pegar essa exceção e trata-la exibindo ao usuário como um erro normal no formulário isso por que penso que se tiver que refazer todas as minhas validações do meu bean na minha classe de validação estarei me repetindo e acredito que isso não seja uma boa prática.

Abs.

vc tem uma classe de validação? ou vc se refere ao controller?

em todo caso, existem dois tipos de validações, as de dados e as de negócio… para as validações de dados (campo não vazio ou nulo, maior que zero, etc) o melhor é usar o BeanValidations… Você pode reaproveitar essas validações na sua classe de validação, basta receber o Validator do beanValidations.

e, como eu disse, você pode fazer um try…catch na chamada do dao (ou o que quer que vc use) capturando a ConstraintViolationException ou a PersistenceException, e logo em seguida adicionando um erro de validação.

Tentarei resolver assim Lucas. Obrigado.