InstantiationException with client passed proxies
cdelashmutt Aug 11, 2006 2:05 PMI;m trying to code up a little example using JBoss Remoting 1.4.4 in JBoss AS 4.0.4.GA, and JBoss Serialization. This example is based on the "Trasporters sample - proxy" example in the user guide.
I've got an MBean that manages the lifecycle of a socket based Remoting server that has a few methods in it. The client can get a reference to the server (hosted at socket://localhost:5400/?serializationtype=jboss), and call a method on the server that returns a String with no problems. However, if I try to create a proxy for a pojo on the client and pass that into the server, I get an InstatiationException from within the remoting framework when I call a method on the server and pass in the proxy.
Here is a snippet from the TestClient main method:
//Get the remote server remote = (TestRemote) TransporterClient.createTransporterClient( "socket://localhost:5400/?serializationtype=jboss", TestRemote.class); //Just test out getting a simple String String classPath = remote.getMyClasspath(); System.out.println("Server Classpath: " + classPath); //Create a new PersonImpl which implements a Person interface PersonImpl aPerson = new PersonImpl("Chris DeLashmutt"); aPerson.setAge(31); System.out.println("Asserting Person " + aPerson.getName() + " with age of " + aPerson.getAge()); //Create a local server for the Person proxy server = TransporterServer.createTransporterServer( "socket://localhost:5401/?serializationtype=jboss", aPerson, Person.class.getName()); //Create the proxy to pass to the server Person personProxy = (Person) TransporterClient .createTransporterClient( "socket://localhost:5401/?serializationtype=jboss", Person.class); //Pass the person to the server remote.assertFact(personProxy); //Have the server set a random age on the Person through the proxy System.out.println("Fireing rules"); remote.applyRules(); //Show the new age of the person System.out.println("Person " + aPerson.getName() + " now has age of " + aPerson.getAge());
The server is very simple, and the exception I get is on the server side, but before my method actually gets invoked. The Person interface just specifies a couple getters/setters for name and age, and the PersonImpl is just a POJO with a no-arg constructor, and a String constructor to set the name.
The exception I get is a SerializationException caused by an InstantiationException. It looks like the error is coming from the Remoting code trying to instantiate an org.jboss.remoting.transport.local.LocalClientInvoker, but there isn't any no-arg constructor for that class, so it fails.
13:55:11,187 ERROR [ServerThread] failed org.jboss.serial.exception.SerializationException: Could not create instance of org.jboss.remoting.transport.local.LocalClientInvoker - org.jboss.remoting.transport.local.LocalClientInvoker at org.jboss.serial.classmetamodel.ClassMetaData.newInstance(ClassMetaData.java:327) at org.jboss.serial.persister.RegularObjectPersister.readData(RegularObjectPersister.java:239) at org.jboss.serial.objectmetamodel.ObjectDescriptorFactory.readObjectDescriptionFromStreaming(ObjectDescriptorFactory.java:411) at org.jboss.serial.objectmetamodel.ObjectDescriptorFactory.objectFromDescription(ObjectDescriptorFactory.java:81) at org.jboss.serial.objectmetamodel.DataContainer$DataContainerDirectInput.readObject(DataContainer.java:639) at org.jboss.serial.persister.RegularObjectPersister.readSlotWithFields(RegularObjectPersister.java:353) at org.jboss.serial.persister.RegularObjectPersister.defaultRead(RegularObjectPersister.java:273) at org.jboss.serial.persister.RegularObjectPersister.readData(RegularObjectPersister.java:241) at org.jboss.serial.objectmetamodel.ObjectDescriptorFactory.readObjectDescriptionFromStreaming(ObjectDescriptorFactory.java:411) at org.jboss.serial.objectmetamodel.ObjectDescriptorFactory.objectFromDescription(ObjectDescriptorFactory.java:81) at org.jboss.serial.objectmetamodel.DataContainer$DataContainerDirectInput.readObject(DataContainer.java:639) at org.jboss.serial.persister.RegularObjectPersister.readSlotWithFields(RegularObjectPersister.java:353) at org.jboss.serial.persister.RegularObjectPersister.defaultRead(RegularObjectPersister.java:273) at org.jboss.serial.persister.RegularObjectPersister.readData(RegularObjectPersister.java:241) at org.jboss.serial.objectmetamodel.ObjectDescriptorFactory.readObjectDescriptionFromStreaming(ObjectDescriptorFactory.java:411) at org.jboss.serial.objectmetamodel.ObjectDescriptorFactory.objectFromDescription(ObjectDescriptorFactory.java:81) at org.jboss.serial.objectmetamodel.DataContainer$DataContainerDirectInput.readObject(DataContainer.java:639) at org.jboss.serial.persister.ProxyPersister.readData(ProxyPersister.java:66) at org.jboss.serial.objectmetamodel.ObjectDescriptorFactory.readObjectDescriptionFromStreaming(ObjectDescriptorFactory.java:411) at org.jboss.serial.objectmetamodel.ObjectDescriptorFactory.objectFromDescription(ObjectDescriptorFactory.java:81) at org.jboss.serial.objectmetamodel.DataContainer$DataContainerDirectInput.readObject(DataContainer.java:639) at org.jboss.serial.persister.ArrayPersister.readObjectArray(ArrayPersister.java:196) at org.jboss.serial.persister.ArrayPersister.readData(ArrayPersister.java:172) at org.jboss.serial.objectmetamodel.ObjectDescriptorFactory.readObjectDescriptionFromStreaming(ObjectDescriptorFactory.java:411) at org.jboss.serial.objectmetamodel.ObjectDescriptorFactory.objectFromDescription(ObjectDescriptorFactory.java:81) at org.jboss.serial.objectmetamodel.DataContainer$DataContainerDirectInput.readObject(DataContainer.java:639) at org.jboss.serial.persister.RegularObjectPersister.readSlotWithFields(RegularObjectPersister.java:353) at org.jboss.serial.persister.RegularObjectPersister.defaultRead(RegularObjectPersister.java:273) at org.jboss.serial.persister.RegularObjectPersister.readData(RegularObjectPersister.java:241) at org.jboss.serial.objectmetamodel.ObjectDescriptorFactory.readObjectDescriptionFromStreaming(ObjectDescriptorFactory.java:411) at org.jboss.serial.objectmetamodel.ObjectDescriptorFactory.objectFromDescription(ObjectDescriptorFactory.java:81) at org.jboss.serial.objectmetamodel.DataContainer$DataContainerDirectInput.readObject(DataContainer.java:639) at org.jboss.serial.persister.RegularObjectPersister.readSlotWithFields(RegularObjectPersister.java:353) at org.jboss.serial.persister.RegularObjectPersister.defaultRead(RegularObjectPersister.java:273) at org.jboss.serial.persister.RegularObjectPersister.readData(RegularObjectPersister.java:241) at org.jboss.serial.objectmetamodel.ObjectDescriptorFactory.readObjectDescriptionFromStreaming(ObjectDescriptorFactory.java:411) at org.jboss.serial.objectmetamodel.ObjectDescriptorFactory.objectFromDescription(ObjectDescriptorFactory.java:81) at org.jboss.serial.objectmetamodel.DataContainer$DataContainerDirectInput.readObject(DataContainer.java:639) at org.jboss.serial.io.JBossObjectInputStream.readObjectOverride(JBossObjectInputStream.java:165) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:333) at org.jboss.remoting.serialization.impl.jboss.JBossSerializationManager.receiveObject(JBossSerializationManager.java:127) at org.jboss.remoting.marshal.serializable.SerializableUnMarshaller.read(SerializableUnMarshaller.java:66) at org.jboss.remoting.transport.socket.ServerThread.processInvocation(ServerThread.java:350) at org.jboss.remoting.transport.socket.ServerThread.dorun(ServerThread.java:412) at org.jboss.remoting.transport.socket.ServerThread.run(ServerThread.java:239) Caused by: java.lang.InstantiationException: org.jboss.remoting.transport.local.LocalClientInvoker at java.lang.Class.newInstance0(Class.java:335) at java.lang.Class.newInstance(Class.java:303) at org.jboss.serial.classmetamodel.ClassMetaData.newInstance(ClassMetaData.java:319) ... 44 more
What am I doing wrong here?