[
http://jira.jboss.com/jira/browse/JBAOP-347?page=comments#action_12417367 ]
Flavia Rainone commented on JBAOP-347:
--------------------------------------
We always appreciate help from the community in spotting bugs and we always do the best we
can to deliver the fixes in a reasonable amount of time. However, we have been busy with
other tasks such as AS integration and our way towards 2.0 GA. As a result, we don't
find enough time to tackle all open issues. To me, it is kind of sad to see Jira being
used for comments such as the one above.
ClassCastException in MarshalledValue.java
------------------------------------------
Key: JBAOP-347
URL:
http://jira.jboss.com/jira/browse/JBAOP-347
Project: JBoss AOP
Issue Type: Patch
Security Level: Public(Everyone can see)
Affects Versions: 1.5.3.GA, 2.0.0.CR12
Environment: JBoss 4.0.4, JBossAOP 1.5.1, JDK 1.6
Reporter: Tim McCune
Assigned To: Flavia Rainone
Fix For: 1.5.7.GA, 2.0.0.CR13
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.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://jira.jboss.com/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira