Bugs item #845157, was opened at 2003-11-19 14:38
Message generated for change (Comment added) made by kgilpin
You can respond by visiting:
https://sourceforge.net/tracker/?func=detail&atid=376685&aid=845157&group_id=22866
Category: JBossServer
Group: v3.2
Status: Open
Resolution: None
Priority: 7
Submitted By: Kevin Gilpin (kgilpin)
Assigned to: Nobody/Anonymous (nobody)
Summary: ClassCastException with PortableRemoteObject.narrow using jb
Initial Comment:
I have 2 EJB applications which are each deployed with
a jboss-app.xml file so that they will have separate
classloader hierarchies. The reason for this is that
the two applications share some common JAR files such
as some base utilities, Hibernate beans, and 3rd party
ones such as struts.
Both applications have an EJB session bean which
implements the same home and session interfaces. These
beans register themselves in JNDI, and a common UI
finds them in a generic manner and exposes a UI for
invoking them (the session interface is IScriptRemote).
The problem occurs when the first application looks up
the IScriptRemote from the second application in the
following code. A ClassCastException occurs on the last
line you see here. Before I created the jboss-app.xml
files, no exception occurred (but I had other problems
with LinkerErrors).
InitialContext ic = J2EEUtil.getInitialContext(port,
principal, credentials);
try {
NamingEnumeration e = ic.listBindings(JNDI_SCRIPT_ROOT);
while ( e.hasMoreElements() ) {
Binding binding = (Binding)e.next();
Object obj = binding.getObject();
LOG.debug("Got object ", obj, " from binding ", binding);
try {
if ( obj instanceof EJBHome ) {
IScriptRemoteHome home =
(IScriptRemoteHome)PortableRemoteObject.narrow(obj,
IScriptRemoteHome.class);
The reported exception is:
15:24:30,609 WARN [Repository] Exception processing
binding ReloadMetadataScriptHome:
$Proxy44:ikp/script/ReloadMetadataScriptHomeHome
java.lang.ClassCastException
at
com.sun.corba.se.internal.javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:293)
at
javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:134)
at com.ipi.script.Repository.findAll(Repository.java:102)
----------------------------------------------------------------------
>Comment By: Kevin Gilpin (kgilpin)
Date: 2003-12-12 13:40
Message:
Logged In: YES
user_id=44882
Thanks for taking a look at this. Your suggestion does not quite
address the problem, because while there are two EJBs, they
already have different JNDI names. Let me further describe the
situation.
Script.ear contains EJB session and home interfaces, plus an EJB
called TestBean that implements IScriptRemote
IScriptRemoteHome
IScriptRemote
TestBean(IScriptRemote)
Search.ear contains an EJB called ReloadMetadataBean that
implements IScriptRemote. It also contains the EJB interfaces:
IScriptRemoteHome
IScriptRemote
ReloadMetadataBean(IScriptRemote)
TestBean and ReloadMetadataBean are bound to different JNDI
names.
Some code in the Script.ear application attempts to access the
ReloadMetadataBean. When it does so, the ClassCastException
occurs. My educated guess as to why this is happening is that
the Script application is trying to cast the
ReloadMetadataBeanHome to its instance of the
IScriptRemoteHome interface Class, but the object it gets from
JNDI actually implements the IScriptRemoteHome interface that
is loaded by the Search application. This interface is improperly
being handed across EJB applications.
I think that JBoss is trying to optimize the RMI call by handing
the ReloadMetadataBeanHome directly to the Script application,
but this causes the ClassCastException because both applications
have loaded the IScriptRemoteHome interface Class.
I would think that the solution to this problem would involve
something like creating a proxy around ReloadMetadataBean that
implements the right instance of the IScriptRemoteHome
interface (which is probably basically what the non-optimized RMI
implementation would do).
----------------------------------------------------------------------
Comment By: Dario Oliveros (doliveros)
Date: 2003-12-12 12:38
Message:
Logged In: YES
user_id=927266
Hi Kevin,
Try to give different JNDI names to the EJB beans that are
common to both EARs by editing the jboss.xml (use the ant
task to replace the jndi-name at compile time). In that way,
you should be able to do a lookup without a problem.
Let me know if it works.
D�rio
----------------------------------------------------------------------
You can respond by visiting:
https://sourceforge.net/tracker/?func=detail&atid=376685&aid=845157&group_id=22866
-------------------------------------------------------
This SF.net email is sponsored by: IBM Linux Tutorials.
Become an expert in LINUX or just sharpen your skills. Sign up for IBM's
Free Linux Tutorials. Learn everything from the bash shell to sys admin.
Click now! http://ads.osdn.com/?ad_id=1278&alloc_id=3371&op=click
_______________________________________________
JBoss-Development mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/jboss-development