Olá pessoal, a forma que encontrei foi criar uma classe utilitária para tratar as exceções.
Interface ExceptionsUtils
public interface ExceptionsUtils {
/**
* Varre a EJBException (ou qualquer Exception) em busca de suas
* exceções internas aninhadas e retorna a String com a mensagem
* proviniente da Exceção principal (a mensagem da exceção que realmente
* foi a causa do erro).
* @param e Uma exceção de Entrada, provavelmente EJBException.
* @return Uma string com a verdadeira causa do erro vinda da exceção principal na árvore de exceções de EJBException.
*/
public String getMensagemPrincipalDaExcecao(Exception e) throws Exception;
/**
* Varre a EJBException (ou qualquer Exception) em busca de suas
* exceções internas aninhadas e retorna a Exceção principal
* (a exceção que realmente foi a causa do erro).
* @param e Uma exceção de Entrada, provavelmente EJBException.
* @return Uma exceção da verdadeira causa do erro vinda da árvore de exceções de EJBException.
*/
public Exception getExcecaoPrincipalDaExcecao(Exception e) throws Exception;
/**
* Analisa e manipula a exceção repassada ao método, depois prepara
* uma exceção para o tipo repassado ao método de acordo com a mensagem
* (causa da exception) principal.
* @param e Exceção recebida para que haja a manipulação em cima dela.
* @return Uma exceção do tipo repassado ao método.
* @throws Exception Caso haja algo de errado com o método uma exceção será lançada.
*/
public Exception getExcecaoPreparada(Exception e) throws Exception;
}
Classe TratadorDeExceçõesEJBUtil
public class TratadorDeExcecoesEJBUtil implements ExceptionsUtils {
@Override
public String getMensagemPrincipalDaExcecao(Exception ex) throws Exception {
if (ex != null) {
Exception atual = ex;
atual = varrerArvoreDeExcecoes(atual);
return atual.getMessage();
} else {
throw new Exception("O valor recebido para tratamento de exceção foi null");
}
}
@Override
public Exception getExcecaoPrincipalDaExcecao(Exception ex) throws Exception {
if (ex != null) {
Exception atual = ex;
atual = varrerArvoreDeExcecoes(atual);
return atual;
} else {
throw new Exception("O valor recebido para tratamento de exceção foi null");
}
}
@Override
public Exception getExcecaoPreparada(Exception e) throws Exception {
String s = getMensagemPrincipalDaExcecao(e);
ArrayList<String> valoresRecebidosMensagemPrincipalAnalisada = new ArrayList<>();
String mensagemFormatada = null;
//Tentativa de adição de valor duplicado.
if (s.toLowerCase().contains("duplicate")) {
int n = 0;
Pattern p = Pattern.compile("'(.*?)'"); //Padrão da expressão regular que procura pelos valores dentro de aspas.
Matcher m = p.matcher(s);
while (m.find()) { //Faz a busca pelo padrão
valoresRecebidosMensagemPrincipalAnalisada.add(m.group(1)); //Pega valor
}
String novaMensagem = "O valor %s já existe para o campo %s";
Object[] sArray = valoresRecebidosMensagemPrincipalAnalisada.toArray(); //Passa valores para um array de objetos.
mensagemFormatada = String.format(novaMensagem, sArray); //Formata a saída.
}
return new Exception(mensagemFormatada);
}
private Exception varrerArvoreDeExcecoes(Exception atual) {
boolean continuaBuscandoExcecoes = true;
while (continuaBuscandoExcecoes) {
if (atual.getCause() != null) {
atual = (Exception) atual.getCause();
} else {
continuaBuscandoExcecoes = false;
}
}
return atual;
}
}
Assim posso chamar no meu Service o método salvarPessoa por exemplo:
...
try {
pessoaDAO.salvar(pessoa);
pessoaDAO.flush();
} catch (EJBException ex) {
ExceptionsUtils exceptionsUtils = new TratadorDeExcecoesEJBUtil();
PessoaException pe = null;
try {
pe = new PessoaException(exceptionsUtils.getExcecaoPreparada(ex).getMessage());
} catch (Exception ex1) {
Logger.getLogger(PessoaService.class.getName()).log(Level.SEVERE, null, ex1);
pe = new PessoaException(ex1.getMessage());
}
//Se quiser coloca um JOptionPane para ver o resultado...
throw pe;
}
Bem, essa foi a maneira mais elegante que encontrei para capturar a real exceção de uma EJBException, nesse caso tratei uma ConstrainException vinda do banco… No método getExcecaoPreparada, vou selecionando e tratando as exceções a maneira que devo. Se alguém souber outro modo fica em aberto o tópico…
Espero que tenha ajudado, valeu! 