No ClassLoaders found using derived class
fabboco Feb 13, 2006 5:32 AMHi,
I need to store different contents in the same EJB3 container as shows in the following code.
@Entity
@Table(name = "wk_container")
public class Container implements Serializable
{
Long id;
String containerName;
Content content;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public Long getId()
{
return id;
}
public void setId(Long id)
{
this.id = id;
}
public String getContainerName()
{
return containerName;
}
public void setContainerName(String containerName)
{
this.containerName = containerName;
}
public Content getContent()
{
return content;
}
public void setContent(Content content)
{
this.content = content;
}
}
public class Content implements java.io.Serializable
{
String info1;
Long info2;
public String getInfo1()
{
return info1;
}
public void setInfo1(String info1)
{
this.info1 = info1;
}
public Long getInfo2()
{
return info2;
}
public void setInfo2(Long info2)
{
this.info2 = info2;
}
public void function()
{}
}
Container and Content are packaged into a single .jar and deployed into jboss.
My client rich client is
........
ctx = new InitialContext(props);
ContainerManager contManager = (ContainerManager) ctx.lookup("ContainerBean/remote");
Container container1 = new Container();
Container container2 = new Container();
Content content = new Content();
content.setInfo1("string info");
content.setInfo2(new Long(1));
container1.setContainerName("container 1");
container1.setContent(content);
container1 = contManager.merge(container1);
DerivedContent derivedContent = new DerivedContent();
derivedContent.setInfo1("string info");
derivedContent.setInfo2(new Long(2));
container2.setContainerName("container 2");
container2.setContent(derivedContent);
container2 = contManager.merge(container2);
........
DerivedContent is:
public class DerivedContent extends Content implements Serializable
{
public DerivedContent()
{
super();
}
@Override
public void function()
{
System.out.println("DerivedContent function");
}
}
When I try to merge the container2 that includes the DerivedContent instance I get the following error:
Exception in thread "main" java.lang.RuntimeException: java.lang.ClassNotFoundException: No ClassLoaders found for: testworkflowhandlers.client.DerivedContent (no security manager: RMI class loader disabled) at org.jboss.aop.joinpoint.MethodInvocation.getArguments(MethodInvocation.java:227) at org.jboss.ejb3.stateless.StatelessContainer.dynamicInvoke(StatelessContainer.java:216) at org.jboss.aop.Dispatcher.invoke(Dispatcher.java:107) at org.jboss.aspects.remoting.AOPRemotingInvocationHandler.invoke(AOPRemotingInvocationHandler.java:82) at org.jboss.remoting.ServerInvoker.invoke(ServerInvoker.java:580) at org.jboss.remoting.ServerInvoker.invoke(ServerInvoker.java:450) at org.jboss.remoting.transport.socket.ServerThread.processInvocation(ServerThread.java:290) at org.jboss.remoting.transport.socket.ServerThread.dorun(ServerThread.java:344) at org.jboss.remoting.transport.socket.ServerThread.run(ServerThread.java:202) Caused by: java.lang.ClassNotFoundException: No ClassLoaders found for: testworkflowhandlers.client.DerivedContent (no security manager: RMI class loader disabled) at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:371) at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:165) at java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:620) at org.jboss.system.JBossRMIClassLoader.loadClass(JBossRMIClassLoader.java:79) at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:247) at sun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.java:197) at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1538) at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1460) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1693) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1299) at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1912) at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1836) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1713) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1299) at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1628) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1293) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:339) at java.rmi.MarshalledObject.get(MarshalledObject.java:135) at org.jboss.aop.joinpoint.MethodInvocation.getArguments(MethodInvocation.java:219) ... 8 more
The ContainerManager is:
@Stateless
@Remote(ContainerManager.class)
public class ContainerBean implements ContainerManager
{
@PersistenceContext(unitName="Workflow")
private EntityManager manager;
public void persist(Container container)
{
manager.persist(container);
}
public Container merge(Container container)
{
return manager.merge(container);
}
public Container find(Long id)
{
return manager.find(Container.class, id);
}
public void remove(Container container)
{
manager.remove(container);
}
}
It seams to me that the ContainerBean is not able to load DerivedContent since it is not into the deployed jar.
Shouldn't DerivedContent transferred by the RMI protocol ?
I can't put DerivedContent into the jar file since the Container should be a generic manger for different contents and only the client application should know about it.
Can anyone give me any suggestion ?
Thanks
Fabrizio
PS: My environment is
* jboss-4.0.3SP1
* jboss-EJB-3.0_RC5-PFD