dificuldade com capturar excessão ao atualizar JPA + EJB

155 views
Skip to first unread message

Rogério Martins da Silva

unread,
Sep 28, 2011, 2:40:06 PM9/28/11
to jav...@googlegroups.com
boa tarde pessoal, estou trabalhando EJB + JPA em uma aplicação EAR, e estou com o seguinte problema, na minha estrutura ao salvar o objeto caso receba qualquer excessão meu session bean lança uma exception e eu a capturo normalmente no meu managed bean, fazendo o teste com duplicate key, salvar funcionou 100% mas ao atualizar a excessão não é capturada e é estourada na view segue os trechos do código...

session bean

@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class EstadosSession implements EstadosSessionLocal {

   @PersistenceContext
    private EntityManager em;


public T salvar(CadEstado estado) throws EJBException{
        return em.merge(estado);
    }

...
}

managed bean

@Named(value = "mbCadEstado")
@ViewScoped
public class MbCadEstado implements Serializable {

    @EJB
    private EstadosSessionLocal estadosSession;

@Inject
    private CadEstado beanEstado;

    public CadEstado getBeanEstado() {
        return beanEstado;
    }

    public void setBeanEstado(CadEstado beanEstado) {
        this.beanEstado = beanEstado;
    }

public void salvar() {
        try {
            estadosSession.salvar(this.getBeanEstado());
            contexto.adicionaMensagemInfo("Salvo com Sucesso");
            this.limpar();
        } catch (EJBException ex) {
            LastException lastException = new LastException();
            Throwable th = lastException.findLastException(ex);
            if (th instanceof SQLException) {
                contexto.adicionaMensagemErro(new DatabaseException((SQLException) th).getMessage());
            }else{
                contexto.adicionaMensagemErro(th.getMessage());
            }
        } catch (Exception ex) {
            contexto.adicionaMensagemErro("Erro: " + ex.getMessage());
        }

    }

}

--
Atenciosamente: Rogério Martins da Silva
Bacharel em Sistemas de Informação - Universidade Estadual de Goiás
Desenvolvedor Java / C# / PHP
MSN | Talk : rogerioma...@gmail.com
Contato Claro: (64) 8402-2308 
Contato Oi: (64) 8404-8590
Contato Tim: (64) 8122-2608
skype: rogeriomartinsilva

"Eu queria mudar o mundo. Mas não me deram o código fonte"

"Qualquer tolo pode escrever códigos que um computador entenda. Bons programadores escrevem códigos que humanos conseguem entender."

"Grandes espíritos sempre encontraram uma grande resistência das mentes medíocres"

"O sábio nunca diz tudo o que pensa, mas pensa sempre tudo o que diz."  (Aristóteles)

Rogério Martins da Silva

unread,
Sep 28, 2011, 2:41:06 PM9/28/11
to jav...@googlegroups.com
segue a exception..


java.lang.IllegalStateException: Could not commit transaction
	at org.jboss.seam.faces.transaction.TransactionPhaseListener.commitOrRollback(TransactionPhaseListener.java:122)
	at org.jboss.seam.faces.transaction.TransactionPhaseListener.commitOrRollback(TransactionPhaseListener.java:101)
	at org.jboss.seam.faces.transaction.TransactionPhaseListener.handleTransactionsAfterPhase(TransactionPhaseListener.java:79)
	at org.jboss.seam.faces.transaction.TransactionPhaseListener.afterPhase(TransactionPhaseListener.java:56)
	at org.jboss.seam.faces.event.DelegatingPhaseListener.afterPhase(DelegatingPhaseListener.java:36)
	at com.sun.faces.lifecycle.Phase.handleAfterPhase(Phase.java:189)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:107)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
	at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1539)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:343)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
	at br.com.usinaweb.aplicacao.filtros.AutenticacaoSistema.doFilter(AutenticacaoSistema.java:64)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
	at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:98)
	at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162)
	at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:330)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
	at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:174)
	at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:828)
	at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:725)
	at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1019)
	at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225)
	at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
	at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
	at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
	at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
	at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
	at java.lang.Thread.run(Thread.java:722)
Caused by: javax.transaction.RollbackException: Transaction marked for rollback.
	at com.sun.enterprise.transaction.JavaEETransactionImpl.commit(JavaEETransactionImpl.java:473)
	at com.sun.enterprise.transaction.JavaEETransactionManagerSimplified.commit(JavaEETransactionManagerSimplified.java:852)
	at com.sun.enterprise.transaction.UserTransactionImpl.commit(UserTransactionImpl.java:208)
	at org.jboss.seam.transaction.UTTransaction.commit(UTTransaction.java:68)
	at org.jboss.seam.transaction.DefaultSeamTransaction.commit(DefaultSeamTransaction.java:107)
	at org.jboss.seam.faces.transaction.TransactionPhaseListener.commitOrRollback(TransactionPhaseListener.java:109)
	... 38 more
Caused by: javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
	at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1215)
	at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1148)
	at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1154)
	at org.hibernate.ejb.AbstractEntityManagerImpl$3.mapManagedFlushFailure(AbstractEntityManagerImpl.java:1068)
	at org.hibernate.transaction.synchronization.CallbackCoordinator.beforeCompletion(CallbackCoordinator.java:122)
	at org.hibernate.transaction.synchronization.HibernateSynchronizationImpl.beforeCompletion(HibernateSynchronizationImpl.java:51)
	at com.sun.enterprise.transaction.JavaEETransactionImpl.commit(JavaEETransactionImpl.java:435)
	... 43 more
Caused by: org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:96)
	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:268)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:185)
	at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51)
	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216)
	at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:383)
	at org.hibernate.transaction.synchronization.CallbackCoordinator.beforeCompletion(CallbackCoordinator.java:117)
	... 45 more
Caused by: java.sql.BatchUpdateException: Duplicate entry 'GO' for key 'estd_sigla'
	at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:2020)
	at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1451)
	at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
	... 52 more

Brown

unread,
Sep 28, 2011, 3:01:15 PM9/28/11
to jav...@googlegroups.com
Deve esta ai

"BatchUpdateException: Duplicate entry 'GO' for key 'estd_sigla'"




2011/9/28 Rogério Martins da Silva <rogerioma...@gmail.com>

--
Você recebeu esta mensagem por que é membro do Javasf
http://groups.google.com/group/javasf
 
Conheça também o Java Brazil: http://groups.google.com/group/thejavabrazil

Rogério Martins da Silva

unread,
Sep 28, 2011, 3:03:58 PM9/28/11
to jav...@googlegroups.com
sim a exception é duplicate key, o problema é que não consigo captura-la no catch ao atualizar o registro, quando vai salvar da certo.

Brown

unread,
Sep 28, 2011, 3:27:50 PM9/28/11
to jav...@googlegroups.com
Rogério,
se possível troque o catch do cliente (EJBException) por RemoteException,
O problema deve estar aí... tentando capturar um tipo de exceção que não é provida pelo container.

Rogério Martins da Silva

unread,
Sep 28, 2011, 3:42:34 PM9/28/11
to jav...@googlegroups.com
nada, ele passa pelo salvar normal apenas ao sair do metodo que ele joga a exception na tela...

Brown

unread,
Sep 28, 2011, 3:45:52 PM9/28/11
to jav...@googlegroups.com
Rogério, 
estou um pouco ocupado, mas achei algo que irá lhe auxiliar melhor
Boa sorte e vai postando aqui no decorrer

David Faulstich

unread,
Sep 28, 2011, 4:30:29 PM9/28/11
to jav...@googlegroups.com
Se você está utilizando Seam nem precisa utilizar @PersistenceContext e esta anotacao para controle de transação.

Utulize @In para injetar o entityManager e @Transaction para métodos transacionados.

A Exception lancada pode ser até tratada via navegação do seam.

--

Rogério Martins da Silva

unread,
Sep 28, 2011, 4:33:01 PM9/28/11
to jav...@googlegroups.com
estou usando j2ee6 + jpa2 + ejb 3.1

David Faulstich

unread,
Sep 28, 2011, 4:35:31 PM9/28/11
to jav...@googlegroups.com
Ahh legal.

Vi no stacktrace o
org.jboss.seam.faces.transaction

pensei que era seam!!

Valeuz!

Rogério Martins da Silva

unread,
Sep 29, 2011, 9:26:17 AM9/29/11
to jav...@googlegroups.com
bom dia, acabei de encontrar o aparente motivo para não conseguir capturar a excessão, porém não sei como trata-lo. 
quando meu método é executado no "salvar" o jpa dispara o insert naquele momento, por isso se der excetion ele cai no catch. 
agora no atualizar, ao passar pelo merge o jpa não faz nada ele processa todo o método volta ao managed bean, e conclui o método apenas no final ele dispara o update do jpa, 
dai a exception é lançada na tela. 

Alguem tem alguma sugestão de como tratar? e se é possivel pedir para o update ser lançado nakele momento???

Tiago Augusto Nogueira Coelho

unread,
Sep 29, 2011, 9:55:36 AM9/29/11
to jav...@googlegroups.com
Não sei se é o correto a se fazer, mas tenta colocar um flush depois do merge.

Rogério Martins da Silva

unread,
Sep 29, 2011, 10:41:05 AM9/29/11
to jav...@googlegroups.com
o problema foi resolvido com o flush ele executa o comando no momento que o flush é chamado agora aos mais experientes no assunto é o correto a se fazer???

Em 29 de setembro de 2011 10:55, Tiago Augusto Nogueira Coelho <tiagoa...@gmail.com> escreveu:
Não sei se é o correto a se fazer, mas tenta colocar um flush depois do merge.

--
Você recebeu esta mensagem por que é membro do Javasf
http://groups.google.com/group/javasf
 
Conheça também o Java Brazil: http://groups.google.com/group/thejavabrazil
Reply all
Reply to author
Forward
0 new messages