Problema - <a4j:keepAlive>+NotSerializableException

7 respostas
E

Pow galera, queria pedir a ajuda de vocês com uma coisa que já me fez perder umas duas manhãs e gerou um pouco de stress :stuck_out_tongue:

A situação é a seguinte, eu tenho dois combos (um dependente do outro), sendo que eu utilizo ajax pra preencher o combo dependente, até aí tudo tranquilo.

A questão é quando eu tento recuperar os valores, sempre dá erro. Pesquisando aqui pela net, eu descobri que é pq quando um managed bean tem escopo request, ele não mantém o estado entre um request e o outro, ocasionando o erro.

A solução para isso seria usar o a4j:keepAlive ou o <t:saveState>. No meu caso eu optei pelo a4j:keepAlive por já estar usando richfaces no projeto.

O problema é que eu não sei porque, se eu adicionar a tag keepAlive na minha página eu pego a seguinte exception:

java.io.NotSerializableException: br.gov.amapa.managed.beans.SolicitanteMB at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1156) at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326) at java.util.HashMap.writeObject(HashMap.java:1001) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945) at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1461) at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392) at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150) at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1338) at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1146) at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1338) at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1146) at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1338) at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1146) at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1338) at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1146) at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1338) at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1146) at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326) at com.sun.faces.renderkit.ResponseStateManagerImpl.writeState(ResponseStateManagerImpl.java:269) at javax.faces.render.ResponseStateManager.writeState(ResponseStateManager.java:166) at com.sun.faces.application.StateManagerImpl.writeState(StateManagerImpl.java:336) at org.ajax4jsf.application.AjaxStateManager.writeState(AjaxStateManager.java:199) at javax.faces.application.StateManager.writeState(StateManager.java:259) at com.sun.faces.application.ViewHandlerImpl$WriteBehindStateWriter.flushToWriter(ViewHandlerImpl.java:930) at com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:210) at org.ajax4jsf.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:108) at org.ajax4jsf.application.AjaxViewHandler.renderView(AjaxViewHandler.java:189) at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:109) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100) at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:266) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:154) at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:260) at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:366) at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:493) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:111) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:75) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:182) at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:446) at java.lang.Thread.run(Thread.java:619)

E o pior, caso eu serialize a classe SolicitanteMB, eu pego esta outra exception (que é bem semelhante por sinal):

java.io.NotSerializableException: org.springframework.orm.jpa.AbstractEntityManagerFactoryBean$ManagedEntityManagerFactoryInvocationHandler java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1156) java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509) java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474) java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392) java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150) java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509) java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474) java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392) java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150) java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326) org.springframework.transaction.interceptor.TransactionInterceptor.writeObject(TransactionInterceptor.java:186) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) java.lang.reflect.Method.invoke(Method.java:597) java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945) java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1461) java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392) java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150) java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509) java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474) java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392) java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150) java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1338) java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1146) java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509) java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474) java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392) java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150) java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509) java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474) java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392) java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150) java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509) java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474) java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392) java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150) java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509) java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474) java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392) java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150) java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326) java.util.HashMap.writeObject(HashMap.java:1001) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) java.lang.reflect.Method.invoke(Method.java:597) java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945) java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1461) java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392) java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150) java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1338) java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1146) java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1338) java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1146) java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1338) java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1146) java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1338) java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1146) java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1338) java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1146) java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326) com.sun.faces.renderkit.ResponseStateManagerImpl.writeState(ResponseStateManagerImpl.java:269) javax.faces.render.ResponseStateManager.writeState(ResponseStateManager.java:166) com.sun.faces.application.StateManagerImpl.writeState(StateManagerImpl.java:336) org.ajax4jsf.application.AjaxStateManager.writeState(AjaxStateManager.java:199) javax.faces.application.StateManager.writeState(StateManager.java:259) com.sun.faces.application.ViewHandlerImpl$WriteBehindStateWriter.flushToWriter(ViewHandlerImpl.java:930) com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:210) org.ajax4jsf.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:108) org.ajax4jsf.application.AjaxViewHandler.renderView(AjaxViewHandler.java:189) com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:109) com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100) com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) javax.faces.webapp.FacesServlet.service(FacesServlet.java:266) org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:154) org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:260) org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:366) org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:493) org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:111) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:75) org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)

Meu ambiente:

  • JBoss 4.2.3
  • RichFaces 3.2
  • Spring 2.5
  • JSF 1.2

Qualquer ajuda é muito bem vinda pelo amor de deus! :smiley:

7 Respostas

E

up :cry:

E

Bem, eu descobri algumas coisas a respeito do problema, caso interesse a alguém :slight_smile:

Esse erro é causado porque a tag a4j:keepAlive exige que a classe correspondente ao objeto que deve ser “mantido vivo” implemente a interface Serializable.

Quando eu implemento esta interface o erro muda porque todos os atributos do objeto passam a ser serializáveis também, incluse os atributos que referenciam os meus repositórios :shock:

Os repositórios por sua vez referenciam entity managers, e conexões não podem ser serializadas :expressionless:

Vou tentar pensar em uma forma razoável de resolver este problema, assim que eu tiver novidades eu posto aqui.

Espero ter ajudado alguém com essas minhas descobertas :lol:

Obs.: Eu já tentei deixar os atributos que referenciam os repositórios e dataModel transientes, mas não funcionou do mesmo jeito :?

Se alguém tiver alguma sugestão…

alves.Felipe

iae Erick… blz…

então cara… eu estou exatamente com o mesmo problema…
qdo eu uso o <a4j:keepAlive da a seguinte exception:

java.io.NotSerializableException: br.com.mili.mcd.controller.promotorDemonstrador.PromotorDemonstradorController

porém, se eu Serializar meu PromotorDemonstradorController da essa outra exception:

java.io.NotSerializableException: org.springframework.orm.jpa.AbstractEntityManagerFactoryBean$ManagedEntityManagerFactoryInvocationHandler

vc conseguiu achar uma solução para isso??
tem alguma idéia para eu não ter que ficar usando meus bean no scopo session??

valeo
abraco

surfzera

Opa eu só mais um infeliz com o mesmo problema… também fiz os mesmo procedimentos e obtive os mesmos resultados.

E

Pow galera, eu nem consegui resolver esse problema, o que eu fiz foi deixar o bean com escopo session… :cry:

Não sei se é algo relacionado a arquitetura, sei lá. Mas o fato é que não dá pra gente serializar um objeto que mantenha referência pra conexão com banco. Caso a gente coloque a referência pra conexão como “transient”, funciona de boa, mas quando ele deserializa o objeto, a referência pra conexão é perdida e o Spring não consegue injetar de novo… :frowning:

Em uma outra situação, eu usei a tag em um objeto de domínio e tudo funcionou completamente normal :?

Bem que o pessoal mais experiente podia dar umas dicas pra gente… :roll:

alves.Felipe

então… eu criei uma alternativa, para qdo abrir uma tela não aparecer os dados ja preenchido de alguma outra situação…

na verdade, antes eu só usava um b.bean ( controller), mas agora eu defini 2…um continua sendo meu controller ( e continua como session) e
o outro é meu próprio bean ( que esse eu trabalho no request, e eu consigo usar o keepAlive)…

não sei se ajuda…
mas resolveu o problema que eu estava tendo…

J

Olá amigos, seu que estou desenterrando um defunto, mas só para constar.

Acredito que o problema esteja no seu web.xml, na tag javax.faces.STATE_SAVING_METHOD. Se você deixar o estado como client, aí realmente precisa serializar, mas se deixar como server. Funciona.

Abraços

Criado 10 de setembro de 2008
Ultima resposta 2 de mar. de 2009
Respostas 7
Participantes 4