7
respostas

Pegar ConstraintViolationException

Estou tentando capturar a Exception ConstraintViolationException no meu DAO assim:

        try {
            em.persist(categoria);
        } catch(ConstraintViolationException ex){
            System.out.println(ex.getMessage());
        } catch(Exception ex){
            System.out.println(ex.getMessage());
        }

Mas não estou tendo sucesso, só cai no bloco catch que captura Exception.

Andei pesquisando e tentei criar um interceptor para fazer essa captura, desta forma:

@Intercepts(after = JPATransactionInterceptor.class)
public class UniqueExceptionInterceptor {

    private final ControllerMethod controllerMethod;

    @Inject
    public UniqueExceptionInterceptor(ControllerMethod controllerMethod) {
        this.controllerMethod = controllerMethod;
    }

    public UniqueExceptionInterceptor() {
        this(null);
    }


    @Accepts
    public boolean accepts(){
        return "adiciona".equals(controllerMethod.getMethod().getName());
    }

    @AroundCall
    public void intercepta(SimpleInterceptorStack stack){
        try {
            stack.next();
        } catch (ConstraintViolationException ex){
            System.out.println("1");
        } catch (org.hibernate.exception.ConstraintViolationException ex){
            System.out.println("2");
            System.out.println(ex.getConstraintName());
        } 
    }
}

Mas também não tive sucesso, alguém pode me ajudar ? OBS: Estou utilizando o plugin Vraptor-jpa

7 respostas

Oi Luiz Marcello, tudo bem?

Pelo que eu vi você está utilizando o Hibernate né? O Hibernate costuma "embrulhar" as exceptions como HibernateException e é por isso que você não deve estar conseguindo capturá-la.

Posta a stacktrace completa de quando dá a exceção para vermos se é isto mesmo?

Abraço!

net.vidageek.mirror.exception.ReflectionProviderException: Could not invoke method adiciona
javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: could not execute statement
org.hibernate.exception.ConstraintViolationException: could not execute statement
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry 'Terror' for key 'duplicate_nome'

Está nessa sequência, não coloquei a stack inteira porque a plataforma bloqueia pela quantidade de caracteres

Alguém me ajuda pls...

Oi Luiz, tudo bem?

Desculpa, não chegou a notificação aqui da sua resposta e por isso acabei não vendo...

Então, é exatamente isto que está acontecendo, é lançada uma MySQLIntegrityConstraintViolationException que por sua vez é embrulhada em uma ConstraintViolationException que é embrulhada em uma PersistenceException e que é mais uma vez embrulhada em uma ReflectionProviderException.

Você pode pegar a exceção de origem usando a biblioteca commons-lang da Apache que provavelmente já deve estar no build path do seu projeto pois muitas outras bibliotecas dependem dela.

Para pegar a exceção de origem é só usar o método ExceptionUtils#getRootCause.

Neste caso você pegará a MySQLIntegrityConstraintViolationException e não a ConstraintViolationException.

Abraço!

Oi Joviane, estou bem ! Você poderia mostrar um exemplo de como implementar essa solução que você me descreveu agora ?

Alguém ?

alguém

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software