I've written a SOAP application with a single method which invokes a
specified method on an EJB.  The name of the EJB and the name of the
method are passed up as Strings.  The return from the method is a single
container-type object, say "A", whose instance fields contain Strings or
primitives plus one Object which contains either a javax.ejb.Handle or a
javax.ejb.HomeHandle.

In the deploy.wsdd, I have <beanMapping> entries for "A", Handle, and
HomeHandle.

When I run the application, passing ejbname "B" and method "create",
I am getting an IOException claiming that "No Serializer can be found
for class $Proxy27".  I hacked the Axis code a bit, and found that the
error occurs while trying to serialize MultiRefs in
org.apache.axis.encoding.SerializationContextImpl.outputMultiRefs(), so
I added code to accumulate descriptions of the multirefs in a
StringBuffer, and dump it if the exception occurred.

What I got was:

MultiRef: com.aonix.Utilities.soap.UtSOAPHandle (I called this "A"
above)
Id: id0
QName: multiRef

MultiRef: org.jboss.proxy.ejb.handle.StatelessHandleImpl (this is the
JBoss implementation of Handle)
Id: id1
QName: multiRef

MultiRef: $Proxy27
Id: id2
QName: multiRef

The exception occurs with this last one.  So I added code to get the
interfaces for this proxy class and print their names.  The only
interface implemented is the Remote interface for EJB "B", so this thing
is clearly the object returned by the EJB's create() call.

However, I can't figure out how Axis KNOWS about this thing.  In my
application class, I call the create() method, take the resulting
EJBObject, get its Handle, and create an instance of the container class
"A" which contains the Handle.  That "A" object is what I return to Axis
as a result.  Nowhere, nohow am I giving Axis the actual EJBObject.
I've trapped the return in Axis and verified this, and the fact that the
multiref list contains an
"org.jboss.proxy.ejb.handle.StatelessHandleImpl" entry bears this out
--- Axis couldn't possibly know about this classname unless the object
wrapped by the "A" instance was an instance of the class.

I even checked the source code for StatelessHandleImpl.  It's only
instance field is a String.

Can anybody tell me how Axis is picking up on this $Proxy class, and how
I can keep it from doing so ?  The first two multiref entries are all
Axis should need to serialize the object I'm returning from the
application class.

Reply via email to