PortableRemoteObject.narrow throws ClassCastException
mrrothstein Apr 25, 2012 3:13 PMI have 2 deployment units:
An ear file the deploys a session bean:
ejb-jar xml:
<enterprise-beans> <session> <display-name>UserManager</display-name> <ejb-name>UserManager</ejb-name> <home>com.package.UserManagerHome</home> <remote>com.package.UserManager</remote> <ejb-class>com.package.UserManagerBean</ejb-class> <session-type>Stateless</session-type> <transaction-type>Container</transaction-type> <resource-ref> <res-ref-name>SSO-DB</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref> </session> </enterprise-beans>
jboss.xml:
<jboss> <enterprise-beans> <session> <ejb-name>UserManager</ejb-name> <jndi-name>SingleSignOn/UserManager</jndi-name> <resource-ref> <res-ref-name>SSO-DB</res-ref-name> <jndi-name>java:/oraclePool</jndi-name> </resource-ref> </session> </enterprise-beans> </jboss>
A war file:
web.xml:
<web-app> .... <ejb-ref> <ejb-ref-name>ejb/UserManager</ejb-ref-name> <ejb-ref-type>Session</ejb-ref-type> <home>com.package.UserManagerHome</home> <remote>com.package.UserManager</remote> </ejb-ref> </web-app>
jboss-web.xml:
<jboss-web> <ejb-ref> <ejb-ref-name>ejb/UserManager</ejb-ref-name> <jndi-name>SingleSignOn/UserManager</jndi-name> </ejb-ref> </jboss-web>
jboss-classloading.xml
<classloading xmlns="urn:jboss:classloading:1.0" parent-first="false" domain="DefaultDomain" top-level-classloader="true" parent-domain="Ignored" export-all="NON_EMPTY" import-all="true"> </classloading>
The ear deployer is set to isolate ear classloaders:
<bean name="EARClassLoaderDeployer" class="org.jboss.deployment.EarClassLoaderDeployer"> <!-- A flag indicating if ear deployments should have their own scoped class loader to isolate their classes from other deployments. --> <property name="isolated">true</property> </bean>
The ejb client jar (built with maven) and all of the *.xml configurations excluded is package with the war.
The home object is loaded by the war classloader in the war and the ear classloader in the ear (according to jmx-console).
When I attempt to do a lookup:
Object obj = new InitialContext().lookup("java:comp/env/ejb/UserManager"); UserManagerHome home = (UserManagerHome) PortableRemoteObject.narrow(obj, UserManagerHome.class);
I get an exception:
java.lang.ClassCastException: $Proxy140 cannot be cast to org.omg.CORBA.Object com.sun.corba.se.impl.javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:228) javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:153) com.package.SingleSignOnBaseServlet.getUserManager(SingleSignOnBaseServlet.java:107) com.package.PasswordCheckServlet.loginUser(PasswordCheckServlet.java:83) com.package.PasswordCheckServlet.doPost(PasswordCheckServlet.java:44) javax.servlet.http.HttpServlet.service(HttpServlet.java:637) javax.servlet.http.HttpServlet.service(HttpServlet.java:717) org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1063) org.apache.struts.tiles.TilesRequestProcessor.doForward(TilesRequestProcessor.java:263) org.apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.java:386) org.apache.struts.tiles.TilesRequestProcessor.processForwardConfig(TilesRequestProcessor.java:318) org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:229) org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194) org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432) com.ams.identicaterd.action.IdenticateRulesDesignerActionServlet.doPost(IdenticateRulesDesignerActionServlet.java:92) javax.servlet.http.HttpServlet.service(HttpServlet.java:637) javax.servlet.http.HttpServlet.service(HttpServlet.java:717) org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
I would like to have the ability to share the session bean between a bunch of web applications that are developed and deployed indipendantly. I'm willing to take the performance hit of treating the call as remote. Is it possible to deploy a single EAR with a session bean jar and multiple wars indipendantly with isolated classloaders and avoid getting this error? I'm assuming the issue is having multiple class instances in the same jvm.
Thanks