java - JSF2.0 @EJB Injection into @ViewScoped causing MyFaces to CFNE -
i'm running jsf project in tomee. upgraded myface 2.1.8. i'm running on osx oracle jvm 1.7.04
so have managedbean viewscoped:
@managedbean @viewscoped public class blogmb implements serializable { private static final long serialversionuid = 1l; @ejb private categoryservice categoryservice; }
here's view code:
<h:commandlink value="#{category.name}"> <f:setpropertyactionlistener target="#{blogmb.selectedcategory}" value="#{category}" /> <f:ajax listener="#{blogmb.filterpostsbycategory()}" execute="@this" render=":blogposts" /> </h:commandlink>
results in stack trace. heck going on? know needs deserialize handles, why have trouble finding service class on classpath?
jul 06, 2012 8:25:51 pm org.apache.myfaces.renderkit.serversidestatecacheimpl deserializeview severe: exiting deserializeview - not deserialize state: com.xxx.blog.service.categoryservice java.lang.classnotfoundexception: com.xxx.blog.service.categoryservice @ java.net.urlclassloader$1.run(urlclassloader.java:366) @ java.net.urlclassloader$1.run(urlclassloader.java:355) @ java.security.accesscontroller.doprivileged(native method) @ java.net.urlclassloader.findclass(urlclassloader.java:354) @ java.lang.classloader.loadclass(classloader.java:423) @ java.lang.classloader.loadclass(classloader.java:356) @ java.lang.class.forname0(native method) @ java.lang.class.forname(class.java:264) @ java.io.objectinputstream.resolveproxyclass(objectinputstream.java:694) @ java.io.objectinputstream.readproxydesc(objectinputstream.java:1549) @ java.io.objectinputstream.readclassdesc(objectinputstream.java:1511) @ java.io.objectinputstream.readordinaryobject(objectinputstream.java:1750) @ java.io.objectinputstream.readobject0(objectinputstream.java:1347) @ java.io.objectinputstream.defaultreadfields(objectinputstream.java:1964) @ java.io.objectinputstream.readserialdata(objectinputstream.java:1888) @ java.io.objectinputstream.readordinaryobject(objectinputstream.java:1771) @ java.io.objectinputstream.readobject0(objectinputstream.java:1347) @ java.io.objectinputstream.readobject(objectinputstream.java:369) @ java.util.hashmap.readobject(hashmap.java:1043) @ sun.reflect.nativemethodaccessorimpl.invoke0(native method) @ sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl.java:57) @ sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:43) @ java.lang.reflect.method.invoke(method.java:601) @ java.io.objectstreamclass.invokereadobject(objectstreamclass.java:1004) @ java.io.objectinputstream.readserialdata(objectinputstream.java:1866) @ java.io.objectinputstream.readordinaryobject(objectinputstream.java:1771) @ java.io.objectinputstream.readobject0(objectinputstream.java:1347) @ java.io.objectinputstream.readarray(objectinputstream.java:1685) @ java.io.objectinputstream.readobject0(objectinputstream.java:1341) @ java.io.objectinputstream.readobject(objectinputstream.java:369) @ java.util.hashmap.readobject(hashmap.java:1043) @ sun.reflect.nativemethodaccessorimpl.invoke0(native method) @ sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl.java:57) @ sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:43) @ java.lang.reflect.method.invoke(method.java:601) @ java.io.objectstreamclass.invokereadobject(objectstreamclass.java:1004) @ java.io.objectinputstream.readserialdata(objectinputstream.java:1866) @ java.io.objectinputstream.readordinaryobject(objectinputstream.java:1771) @ java.io.objectinputstream.readobject0(objectinputstream.java:1347) @ java.io.objectinputstream.readarray(objectinputstream.java:1685) @ java.io.objectinputstream.readobject0(objectinputstream.java:1341) @ java.io.objectinputstream.readobject(objectinputstream.java:369) @ org.apache.myfaces.renderkit.serversidestatecacheimpl.deserializeview(serversidestatecacheimpl.java:497) @ org.apache.myfaces.renderkit.serversidestatecacheimpl.getserializedviewfromservletsession(serversidestatecacheimpl.java:289) @ org.apache.myfaces.renderkit.serversidestatecacheimpl.restoreserializedview(serversidestatecacheimpl.java:891) @ org.apache.myfaces.renderkit.html.htmlresponsestatemanager.getstate(htmlresponsestatemanager.java:205) @ org.apache.myfaces.view.facelets.defaultfaceletsstatemanagementstrategy.restoreview(defaultfaceletsstatemanagementstrategy.java:207) @ org.apache.myfaces.application.statemanagerimpl.restoreview(statemanagerimpl.java:130) @ org.apache.myfaces.shared.view.viewdeclarationlanguagebase.restoreview(viewdeclarationlanguagebase.java:106) @ org.apache.myfaces.view.facelets.faceletviewdeclarationlanguage.restoreview(faceletviewdeclarationlanguage.java:2109) @ org.apache.myfaces.application.viewhandlerimpl.restoreview(viewhandlerimpl.java:300) @ com.ocpsoft.pretty.faces.application.prettyviewhandler.restoreview(prettyviewhandler.java:109) @ javax.faces.application.viewhandlerwrapper.restoreview(viewhandlerwrapper.java:83) @ org.apache.myfaces.lifecycle.restoreviewexecutor.execute(restoreviewexecutor.java:127) @ org.apache.myfaces.lifecycle.lifecycleimpl.executephase(lifecycleimpl.java:170) @ org.apache.myfaces.lifecycle.lifecycleimpl.execute(lifecycleimpl.java:117) @ javax.faces.webapp.facesservlet.service(facesservlet.java:197) @ org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:305) @ org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:210) @ com.ocpsoft.pretty.prettyfilter.dofilter(prettyfilter.java:145) @ org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:243) @ org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:210) @ org.omnifaces.filter.gzipresponsefilter.dofilter(gzipresponsefilter.java:147) @ org.omnifaces.filter.httpfilter.dofilter(httpfilter.java:75) @ org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:243) @ org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:210) @ org.apache.catalina.core.standardwrappervalve.invoke(standardwrappervalve.java:225) @ org.apache.catalina.core.standardcontextvalve.invoke(standardcontextvalve.java:169) @ org.apache.tomee.catalina.openejbvalve.invoke(openejbvalve.java:44) @ org.apache.catalina.authenticator.authenticatorbase.invoke(authenticatorbase.java:472) @ org.apache.catalina.core.standardhostvalve.invoke(standardhostvalve.java:168) @ org.apache.catalina.valves.errorreportvalve.invoke(errorreportvalve.java:98) @ org.apache.catalina.valves.accesslogvalve.invoke(accesslogvalve.java:927) @ org.apache.catalina.core.standardenginevalve.invoke(standardenginevalve.java:118) @ org.apache.catalina.connector.coyoteadapter.service(coyoteadapter.java:407) @ org.apache.coyote.http11.abstracthttp11processor.process(abstracthttp11processor.java:999) @ org.apache.coyote.abstractprotocol$abstractconnectionhandler.process(abstractprotocol.java:565) @ org.apache.tomcat.util.net.jioendpoint$socketprocessor.run(jioendpoint.java:309) @ java.util.concurrent.threadpoolexecutor.runworker(threadpoolexecutor.java:1110) @ java.util.concurrent.threadpoolexecutor$worker.run(threadpoolexecutor.java:603) @ java.lang.thread.run(thread.java:722)
edit update:
logged ticket https://issues.apache.org/jira/browse/myfaces-3581
looks need patch deserializeview
method in myfaces. long story short objectinputstream not use thread context classloader (thread.currentthread().getclassloader()
). kind of "use right classloader, damn it!" fixing pervasive in app servers. if myfaces in web-inf/lib/
magically go away because myfaces , class being deserialized in same classloader. moving myfaces not right fix, though. patching better.
when class doing deserializing in parent classloader , therefore cannot see classes numerous child classloaders (one each webapp), typically have this:
import java.io.*; import java.lang.reflect.proxy; public class smarterobjectinputstream extends objectinputstream { public smarterobjectinputstream(inputstream in) throws ioexception { super(in); } protected class resolveclass(objectstreamclass classdesc) throws ioexception, classnotfoundexception { try { return class.forname(classdesc.getname(), false, getclassloader()); } catch (classnotfoundexception e) { string n = classdesc.getname(); if (n.equals("boolean")) return boolean.class; if (n.equals("byte")) return byte.class; if (n.equals("char")) return char.class; if (n.equals("short")) return short.class; if (n.equals("int")) return int.class; if (n.equals("long")) return long.class; if (n.equals("float")) return float.class; if (n.equals("double")) return double.class; throw e; } } protected class resolveproxyclass(string[] interfaces) throws ioexception, classnotfoundexception { class[] cinterfaces = new class[interfaces.length]; (int = 0; < interfaces.length; i++) cinterfaces[i] = getclassloader().loadclass(interfaces[i]); try { return proxy.getproxyclass(getclassloader(), cinterfaces); } catch (illegalargumentexception e) { throw new classnotfoundexception(null, e); } } private classloader getclassloader() { return thread.currentthread().getcontextclassloader(); } }
we'll need give myfaces smarterobjectinputstream
, make sure use in deserializeview
method.
if you'd honors of doing patching, that'd fantastic , i'm sure myfaces quite enthused see tomee users contributing fixes. you've had great contributions far!
Comments
Post a Comment