Solucionado (ver solução)
Solucionado
(ver solução)
8
respostas

Dúvida no Ex. 1 da Aula 5 - Lidando com Exceções

Quando tento inserir null em um campo obrigatório o sistema exibe no console a exceção:

javax.ejb.EJBTransactionRolledbackException

E dentro dela exceção que causou a falha:

java.sql.SQLException: ORA-01407: não é possível atualizar ("CARRO"."NOME") para NULL

Eu quero capturar e exibir na tela a SQLException, porém, só consigo exibir a EJBTransactionRolledbackException.

Alguém pode me ajudar?

Grato.

8 respostas

Oi Alexandre,

Repare que vc recebe uma SQLException que mostra um codigo de erro do seu banco de dados. Isso significa que vc enviou um comando SQL com dados inválidos.

Idealmente vc valida os seus dados antes de enviar o comando SQL, já na camada web. Agora depende um pouco do seu framework web para saber como executar essa validação. Por exemplo, com JSF vc poderia utilizar Bean Validation para a validação.

abs

Boa tarde Nico, obrigado por responder!

Eu seu que devo validar, apenas gostaria de saber se é possível extrair essa exceção que foi "empacotada" pela EJBTransactionRolledbackException. Esse caso do SqlException foi apenas um exemplo para explicar a minha dúvida, mas poderia ser outra exceção.

É possível extrair essa exceção "empacotada"?

Grato.

ah, agora entendi (acho).

qualquer exceção tem uma root cause que vc pode pegar através do método getCause(), por exemplo:

Exception causa = ejbException.getCause();

abs

Bom dia Nico,

Fiz o teste, mas também não funciona.

getCause retorna: Transaction rolled back.

Eu gostaria de capturar a exceção.

java.sql.SQLException: ORA-01407: não é possível atualizar ("CARRO"."NOME") para NULL

Que está dentro da Transaction rolled back.

Sorry Alexandre, falei errado.

Tente o método exception.getRootCause(); !

abs

Nico,

Não encontrei esse método na TransactionRolledbackException nem na java.lang.Exception.

Obrigado pela ajuda.

http://docs.oracle.com/javaee/6/api/javax/transaction/TransactionRolledbackException.html

https://docs.oracle.com/javaee/5/api/javax/servlet/ServletException.html

solução!

Oi Alexandre,

realmente não tem ... arrgggg

No entanto achei isso: A classe ExceptionUtils da biblioteca Apache Commons Lang possui um método auxiliar para pegar a Root Cause:

Throwable getRootCause(Throwable throwable)

Link da documentação: https://commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/apache/commons/lang3/exception/ExceptionUtils.html

Agora não sei se vale colocar uma nova biblioteca no seu projeto para resolver este problema.

Vc também poderia chamar getCause(), pegar o retorno, e chamar getCause() de novo, até chegar na raiz do problema, sempre testando o retorno.

Abs

Nico,

Maravilha, funcionou com a ExceptionUtils. Agora o usuário poderá nos enviar o print da tela com o erro exato, não apenas a EJBTransactionRolledbackException, que é genérica e obriga o analista a entrar no log e procurar a causa do problema.

Espero que essa thread ajude outras pessoas.

Muito obrigado por sua ajuda! Abs