Pessoal,
O problema é o seguinte, estou utilizando o seam 2.1.2 e no meu negocio sempre que for lancada uma exceção no componente seam eu devo gravar um log no banco. So que devido ao seam gerenciar a transação, quando é lançada uma exception dentro do catch, a transação ja foi encerrada. Tem como eu gerenciar isso ou impedir de alguma forma que a transação somente seja encerrada apos a saida do método?
Entendo que no catch deva ser dado o rollback, mas encerrar a transação nao entendo porque, ela deveria ser encerrada na saida do método. Segue abaixo o erro que ocorre ao tentar gravar um registro na tabela de log:
11:29:43,976 WARN [JDBCExceptionReporter] SQL Error: 0, SQLState: null
11:29:43,976 ERROR [JDBCExceptionReporter] Transaction is not active: tx=TransactionImple < ac, BasicAction: -3f57fee5:946:4ae1aa0c:139 status: ActionStatus.ABORT_ONLY >; - nested throwable: (javax.resource.ResourceException: Transaction is not active: tx=TransactionImple < ac, BasicAction: -3f57fee5:946:4ae1aa0c:139 status: ActionStatus.ABORT_ONLY >)
OBS: nao tem problema de query nem de entidade pq o metodo funciona fora do catch.
segue trecho do codigo:
COMPONENT SEAM
[code]} catch (Exception e) {
FacesMessages.instance().add(Token.ERRO_MSG_GENERICO + e.getCause());
try{
//gravando log da transação
transacaoBean.gravaLog(transacao, StatusTransacao.ERRO, null);
}catch(Exception eg){
FacesMessages.instance().add(Token.ERRO_MSG_GENERICO_LOG + eg.getCause());
return "erro";
}
} [/code]
MÉTODO QUE GRAVA O LOG:
[code]public void gravaLog(TransacaoNova transacaoNova, StatusTransacao eStatusTransacao, String msgErro) throws Exception {
TransacaoNovaLog logTransacao = new TransacaoNovaLog();
logTransacao.setDataLog(new Date());
logTransacao.setTransacaoNova(transacaoNova);
switch (eStatusTransacao){
case CRIADA:
logTransacao.setObservacao("transação criada com sucesso");
logTransacao.setStatus('E');
break;
case PENDENTE:
logTransacao.setObservacao("Falha ao enviar transação ao APLIC: " + msgErro);
logTransacao.setStatus('P');
break;
case SUBMETIDA:
logTransacao.setObservacao("Transação submetida com sucesso");
logTransacao.setStatus('S');
break;
case FINALIZADA:
logTransacao.setObservacao("Transação finalizada com sucesso");
logTransacao.setStatus('F');
break;
case CANCELADA:
logTransacao.setObservacao("Transação cancelada");
logTransacao.setStatus('C');
break;
case ERRO:
logTransacao.setObservacao("falha na transação: " + msgErro);
logTransacao.setStatus('R');
break;
}
em.persist(logTransacao);
}[/code]
Obrigado!!