users@glassfish.java.net

Standalone client, remote class loading issue (FVDCodeBaseImpl.implementation)

From: Martin Weber <m.weber_at_razorcat.com>
Date: Tue, 19 Apr 2011 19:26:10 +0200

Hi all,

I am experiencing a weird problem while unmarshalling an object that is
returned
from a remote session bean to a standalone client. Both client and EJB
code is the
code from the 'duke´s bank' sample tutorial, with a tiny modification:
The returned
type is declared to be an interface, and the EJB´s method is implemented
to return
a concrete class (CustomerDetailsImpl) that is Serializable and
implements the interface.

CustomerDetailsImpl.class is not available on the client´s class path, I
expect it to be
downloaded to the client similar the way RMI handles this case.

When I invoke CustomerController#getDetails() and step through the CORBA
layer, I can see
the method is invoked on the remote bean, and the returned data are
going to be
unmarshalled. The CORBA layer then issues a call to retrieve the class
for the returned object
(FVDCodeBaseImpl.implementation("RMI:com.sun.tutorial.javaee.dukesbank.server.request.CustomerDetailsImpl:C075DCD787A59291:503990CCF040CEAE"))
but that call fails on the server side with a ClassNotFoundException.
This fails with Glassfish V2.1, 3.0.1 and v 3.1.

What am I doing wrong here? Do the EJB specs disallow remote class
loading or is it a
bug in Glassfish ORB?

Thanks for any advice,
  Martin


# Java Code ######################################################
--- EJB API as seen by client code (truncated)
CustomerController.java

public interface CustomerController {
CustomerDetails getDetails(Long customerId) throws
CustomerNotFoundException, InvalidParameterException;
}

CustomerDetails.java

public interface CustomerDetails {
   ... lots of getters and setters
}

--- EJB implementation (truncated)
@Stateless
@Remote(value = { CustomerController.class })
public class CustomerControllerBean implements CustomerController {
     public CustomerDetails getDetails(Long customerId){
       return new new CustomerDetailsImpl(...);

/*package*/ class CustomerDetailsImpl implements java.io.Serializable,
CustomerDetails {
   ... lots of getters and setters
}

# Stack trace ######################################################
Exception in thread "AWT-EventQueue-0" javax.ejb.EJBException:
java.rmi.RemoteException: CORBA NO_IMPLEMENT 1398079489 Maybe; nested
exception is:
        org.omg.CORBA.NO_IMPLEMENT: ----------BEGIN server-side stack
trace----------
org.omg.CORBA.NO_IMPLEMENT: WARNUNG: IOP01000001: Missing local value
implementation vmcid: SUN minor code: 1 completed: Maybe
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
        at
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
        at
com.sun.corba.ee.spi.orbutil.logex.corba.CorbaExtension.makeException(CorbaExtension.java:248)
        at
com.sun.corba.ee.spi.orbutil.logex.corba.CorbaExtension.makeException(CorbaExtension.java:95)
        at
com.sun.corba.ee.spi.orbutil.logex.WrapperGenerator.handleFullLogging(WrapperGenerator.java:387)
        at
com.sun.corba.ee.spi.orbutil.logex.WrapperGenerator.access$400(WrapperGenerator.java:107)
        at
com.sun.corba.ee.spi.orbutil.logex.WrapperGenerator$2.invoke(WrapperGenerator.java:511)
        at
com.sun.corba.ee.spi.orbutil.proxy.CompositeInvocationHandlerImpl.invoke(CompositeInvocationHandlerImpl.java:99)
        at $Proxy130.missingLocalValueImpl(Unknown Source)
        at
com.sun.corba.ee.impl.io.FVDCodeBaseImpl.implementation(FVDCodeBaseImpl.java:113)
        at
com.sun.org.omg.SendingContext._CodeBaseImplBase._invoke(_CodeBaseImplBase.java:99)
        at
com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:528)
        at
com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:199)
        at
com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1624)
        at
com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:1486)
        at
com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleInput(CorbaMessageMediatorImpl.java:990)
        at
com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:214)
        at
com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:742)
        at
com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.dispatch(CorbaMessageMediatorImpl.java:539)
        at
com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.doWork(CorbaMessageMediatorImpl.java:2324)
        at
com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.performWork(ThreadPoolImpl.java:497)
        at
com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:540)
Caused by: java.lang.ClassNotFoundException:
com.sun.tutorial.javaee.dukesbank.server.request.CustomerDetailsImpl
        at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:247)
        at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:434)
        at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:165)
        at java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:620)
        at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:202)
        at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:135)
        at com.sun.corba.ee.impl.util.JDKBridge.loadClassM(JDKBridge.java:319)
        at com.sun.corba.ee.impl.util.JDKBridge.loadClass(JDKBridge.java:228)
        at com.sun.corba.ee.impl.javax.rmi.CORBA.Util.loadClass(Util.java:640)
        at
com.sun.corba.ee.impl.util.RepositoryId.getClassFromType(RepositoryId.java:577)
        at
com.sun.corba.ee.impl.io.ValueHandlerImpl.getClassFromType(ValueHandlerImpl.java:373)
        at
com.sun.corba.ee.impl.io.FVDCodeBaseImpl.implementation(FVDCodeBaseImpl.java:105)
        ... 12 more

----------END server-side stack trace---------- vmcid: SUN minor code:
1 completed: Maybe
        at
com.sun.tutorial.javaee.dukesbank.api._CustomerController_Wrapper.getDetails(com/sun/tutorial/javaee/dukesbank/api/_CustomerController_Wrapper.java)
        at
com.sun.tutorial.javaee.dukesbank.client.BankAdmin.customerOpenButtonMouseReleased(BankAdmin.java:1308)


-- 
E-Mails sollten Text sein, Text und nur Text.
Wenn Gott gewollt hätte, dass E-Mails in HTML geschrieben würden,
endeten Gebete traditionell mit </amen>.