Mule ESB序列化不兼容错误

时间:2017-01-19 20:35:02

标签: serialization soap https mule cxf

在从Mule 3.2.2到Mule 3.7.1进行服务调用时,我收到以下异常。

虽然org.mule.transformer.types.SimpleDataType类的serialver在两个运行时都不同,但我不确定为什么这是一个问题。因为Object无论如何都被序列化为SOAP请求。

感谢任何帮助!

Mule 3.2.2运行时中的客户端代码:

<cxf:jaxws-client serviceClass="org.test" doc:name="SOAP"  >
<cxf:ws-security>
    <cxf:ws-config>
        <cxf:property key="action" value="UsernameToken"/>
        <cxf:property key="user" value="test"/>
        <cxf:property key="passwordCallbackRef" value-ref="passwordCallbackHandler" />
        <cxf:property key="passwordType" value="PasswordText" />
    </cxf:ws-config>
</cxf:ws-security>

异常

 Message               : Failed to route event via endpoint: DefaultOutboundEndpoint{endpointUri=https://testlb:17105/service/1.0/, connector=HttpsConnector
{
  name=connector.https.mule.default
  lifecycle=start
  this=60de93b4
  numberOfConcurrentTransactedReceivers=4
  createMultipleTransactedReceivers=true
  connected=true
  supportedProtocols=[https]
  serviceOverrides=<none>
}
,  name='endpoint.https.testlb.17105.service.1.0', mep=REQUEST_RESPONSE, properties={}, transactionConfig=Transaction{factory=null, action=INDIFFERENT, timeout=0}, deleteUnacceptedMessages=false, initialState=started, responseTimeout=60000, endpointEncoding=UTF-8, disableTransportTransformer=false}. Message payload is of type: PostMethod
Code                  : MULE_ERROR-42999
--------------------------------------------------------------------------------
Exception stack is:
1. org.mule.transformer.types.SimpleDataType; local class incompatible: stream classdesc serialVersionUID = 734974842501135657, local class serialVersionUID = 6394740184248968880 (java.io.InvalidClassException)
  java.io.ObjectStreamClass:617 (null)
2. java.io.InvalidClassException: org.mule.transformer.types.SimpleDataType; local class incompatible: stream classdesc serialVersionUID = 734974842501135657, local class serialVersionUID = 6394740184248968880 (org.apache.commons.lang.SerializationException)
  org.mule.util.SerializationUtils:89 (null)
3. Failed to route event via endpoint: DefaultOutboundEndpoint{endpointUri=https://testlb:17105/service/1.0/, connector=HttpsConnector
{
  name=connector.https.mule.default
  lifecycle=start
  this=60de93b4
  numberOfConcurrentTransactedReceivers=4
  createMultipleTransactedReceivers=true
  connected=true
  supportedProtocols=[https]
  serviceOverrides=<none>
}
,  name='endpoint.https.testlb.17105.service.1.0', mep=REQUEST_RESPONSE, properties={}, transactionConfig=Transaction{factory=null, action=INDIFFERENT, timeout=0}, deleteUnacceptedMessages=false, initialState=started, responseTimeout=60000, endpointEncoding=UTF-8, disableTransportTransformer=false}. Message payload is of type: PostMethod (org.mule.api.transport.DispatchException)
  org.mule.transport.AbstractMessageDispatcher:109 (http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/api/transport/DispatchException.html)
--------------------------------------------------------------------------------
Root Exception stack trace:
java.io.InvalidClassException: org.mule.transformer.types.SimpleDataType; local class incompatible: stream classdesc serialVersionUID = 734974842501135657, local class serialVersionUID = 6394740184248968880
    at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:617)
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1622)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1517)
    + 3 more (set debug level logging or '-Dmule.verbose.exceptions=true' for everything)

2 个答案:

答案 0 :(得分:0)

你是对的。它应该不是问题。但是,Java具有序列化的最佳实践 - 不混合不兼容的类,这些类看起来完全相同的serialVersionUID属性被添加到类中。通常开发人员不会关注它,但是当他们这样做时,意味着课程真的不同。

这实际上意味着您无法使用序列化来传递数据。你的情况就是很好的例子。

要解决这个问题,你必须摆脱序列化 - 这个类在这两个版本的Mule中是不同的。

另一个选择是用更稳定的东西替换类。甚至创建自己的SimpleDataType。

或者您可以使用Mule支持版本不兼容打开票证。但是我怀疑他们会出于同样的原因修复它 - 类别是不同的,这也是它们的原因。

答案 1 :(得分:0)

此问题已修复!

如Mule documentation中所述,3.7.1运行时的会话变量被包装到SimpleDataType.class上,并且此序列化的Base64编码字符串作为MULE_SESSION标头传递给另一个运行时。当另一个运行时反序列化此标头时,由于类版本不同,它会抛出错误。

通过将此NullSessionHandler传递给HTTP连接器来修复它,因为我们不关心该标头。

<service-overrides sessionHandler="org.mule.session.NullSessionHandler"/>