Uploaded image for project: 'JBoss AOP'
  1. JBoss AOP
  2. JBAOP-347

ClassCastException in MarshalledValue.java

    XMLWordPrintable

    Details

    • Type: Bug
    • Status: Closed (View Workflow)
    • Priority: Major
    • Resolution: Done
    • Affects Version/s: 1.5.3.GA, 2.0.0.CR12
    • Fix Version/s: 1.5.7.GA, 2.0.0.CR13
    • Component/s: None
    • Labels:
      None
    • Environment:

      JBoss 4.0.4, JBossAOP 1.5.1, JDK 1.6

    • Estimated Difficulty:
      Low

      Description

      I tried enabling JBoss serialization with EJB 3 remoting for the first time today, by changing the line
      <attribute name="InvokerLocator">socket://${jboss.bind.address}:3873</attribute>
      to
      <attribute name="InvokerLocator">socket://${jboss.bind.address}:3873/?serializationtype=jboss</attribute>
      in ejb3.deployer/META-INF/jboss-service.xml. When I do this, any remote call to my EJB results in the following exception on the client:

      java.lang.ClassCastException: org.jboss.serial.objectmetamodel.DataContainer$DataContainerDirectOutput
      at org.jboss.aop.util.MarshalledValue.writeExternal(MarshalledValue.java:190)
      at org.jboss.serial.persister.ExternalizePersister.writeData(ExternalizePersister.java:58)
      at org.jboss.serial.objectmetamodel.ObjectDescriptorFactory.describeObject(ObjectDescriptorFactory.java:275)
      at org.jboss.serial.objectmetamodel.DataContainer$DataContainerDirectOutput.writeObject(DataContainer.java:202)
      at org.jboss.aop.metadata.SimpleMetaData.writeExternal(SimpleMetaData.java:226)
      at org.jboss.serial.persister.ExternalizePersister.writeData(ExternalizePersister.java:58)
      at org.jboss.serial.objectmetamodel.ObjectDescriptorFactory.describeObject(ObjectDescriptorFactory.java:275)
      at org.jboss.serial.objectmetamodel.DataContainer$DataContainerDirectOutput.writeObject(DataContainer.java:202)
      at org.jboss.aop.joinpoint.MethodInvocation.writeExternal(MethodInvocation.java:321)
      at org.jboss.serial.persister.ExternalizePersister.writeData(ExternalizePersister.java:58)
      at org.jboss.serial.objectmetamodel.ObjectDescriptorFactory.describeObject(ObjectDescriptorFactory.java:275)
      at org.jboss.serial.objectmetamodel.DataContainer$DataContainerDirectOutput.writeObject(DataContainer.java:202)
      at org.jboss.serial.persister.RegularObjectPersister.writeSlotWithFields(RegularObjectPersister.java:182)
      at org.jboss.serial.persister.RegularObjectPersister.defaultWrite(RegularObjectPersister.java:90)
      at org.jboss.serial.persister.RegularObjectPersister.writeData(RegularObjectPersister.java:62)
      at org.jboss.serial.objectmetamodel.ObjectDescriptorFactory.describeObject(ObjectDescriptorFactory.java:275)
      at org.jboss.serial.objectmetamodel.DataContainer$DataContainerDirectOutput.writeObject(DataContainer.java:202)
      at org.jboss.serial.io.JBossObjectOutputStream.writeObjectOverride(JBossObjectOutputStream.java:181)
      at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:298)
      at org.jboss.remoting.serialization.impl.jboss.JBossSerializationManager.sendObject(JBossSerializationManager.java:87)
      at org.jboss.remoting.marshal.serializable.SerializableMarshaller.write(SerializableMarshaller.java:84)
      at org.jboss.remoting.transport.socket.SocketClientInvoker.transport(SocketClientInvoker.java:273)
      at org.jboss.remoting.RemoteClientInvoker.invoke(RemoteClientInvoker.java:143)
      at org.jboss.remoting.Client.invoke(Client.java:525)
      at org.jboss.remoting.Client.invoke(Client.java:488)
      at org.jboss.aspects.remoting.InvokeRemoteInterceptor.invoke(InvokeRemoteInterceptor.java:55)
      at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
      at org.jboss.aspects.remoting.ClusterChooserInterceptor.invoke(ClusterChooserInterceptor.java:74)
      at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
      at org.jboss.aspects.tx.ClientTxPropagationInterceptor.invoke(ClientTxPropagationInterceptor.java:61)
      at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
      at org.jboss.aspects.security.SecurityClientInterceptor.invoke(SecurityClientInterceptor.java:55)
      at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
      at org.jboss.ejb3.remoting.IsLocalInterceptor.invoke(IsLocalInterceptor.java:77)
      at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
      at org.jboss.ejb3.stateless.StatelessClusteredProxy.invoke(StatelessClusteredProxy.java:100)
      ...

      Looking at the code for MarshalledValue.java in the writeExternal method, the following line casts the ObjectOutput parameter to an OutputStream in order to take advantage of ByteArrayOutputStream's writeTo method:

      baos.writeTo((OutputStream)out);

      However, the assumption that the "out" parameter may be cast to an OutputStream in not a valid one. When using jboss serialization instead of java serialization, the "out" parameter that is passed in is of type org.jboss.serial.objectmetamodel.DataContainer$DataContainerDirectOutput, which implements ObjectOutput, but does not extends OutputStream. A simple fix is to change the line above to:

      out.write(baos.toByteArray());

      I don't know if the writeTo method gives noticeably better performance. If it does, it might be worth it to do an instanceof check first.

        Gliffy Diagrams

          Attachments

            Issue Links

              Activity

                People

                • Assignee:
                  flavia.rainone Flavia Rainone
                  Reporter:
                  javajedi Tim McCune
                • Votes:
                  0 Vote for this issue
                  Watchers:
                  0 Start watching this issue

                  Dates

                  • Created:
                    Updated:
                    Resolved: