Serialization Mule ESB序列化不兼容错误

Serialization Mule ESB序列化不兼容错误,serialization,soap,https,mule,cxf,Serialization,Soap,Https,Mule,Cxf,从Mule 3.2.2到Mule 3.7.1进行服务调用时,我得到以下异常 虽然org.mule.transformer.types.SimpleDataType类的serialver在两个运行时上都不同,但我不确定这是一个问题。因为对象已序列化为SOAP请求 感谢您的帮助 Mule 3.2.2运行时中的客户端代码: <cxf:jaxws-client serviceClass="org.test" doc:name="SOAP" > <cxf:ws-security>

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

虽然org.mule.transformer.types.SimpleDataType类的serialver在两个运行时上都不同,但我不确定这是一个问题。因为对象已序列化为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)
消息:未能通过端点路由事件:DefaultOutboundEndpoint{endpointUri=https://testlb:17105/service/1.0/,连接器=https连接器
{
name=connector.https.mule.default
生命周期=开始
这=60de93b4
ConcurrentTransacticedReceiver的数量=4
CreateMultipleTransactedReceiver=true
已连接=真
supportedProtocols=[https]
服务覆盖=
}
,name='endpoint.https.testlb.17105.service.1.0',mep=REQUEST\u RESPONSE,properties={},transactionConfig=Transaction{factory=null,action=interference,timeout=0},deleteUnceptedMessages=false,initialState=started,responseTimeout=60000,endpointEncoding=UTF-8,disableTransportTransformer=false}。消息负载的类型为:PostMethod
代码:MULE_错误-42999
--------------------------------------------------------------------------------
异常堆栈是:
1.org.mule.transformer.types.SimpleDataType;本地类不兼容:流classdesc serialVersionId=734974842501135657,本地类serialVersionId=639474018424896880(java.io.InvalidClassException)
ObjectStreamClass:617(空)
2.java.io.InvalidClassException:org.mule.transformer.types.SimpleDataType;本地类不兼容:stream classdesc SerialVersionId=734974842501135657,本地类SerialVersionId=639474018424896880(org.apache.commons.lang.SerializationException)
org.mule.util.SerializationUtils:89(空)
3.未能通过端点路由事件:DefaultOutboundEndpoint{endpointUri=https://testlb:17105/service/1.0/,连接器=https连接器
{
name=connector.https.mule.default
生命周期=开始
这=60de93b4
ConcurrentTransacticedReceiver的数量=4
CreateMultipleTransactedReceiver=true
已连接=真
supportedProtocols=[https]
服务覆盖=
}
,name='endpoint.https.testlb.17105.service.1.0',mep=REQUEST\u RESPONSE,properties={},transactionConfig=Transaction{factory=null,action=interference,timeout=0},deleteUnceptedMessages=false,initialState=started,responseTimeout=60000,endpointEncoding=UTF-8,disableTransportTransformer=false}。消息负载的类型为: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)
--------------------------------------------------------------------------------
根异常堆栈跟踪:
java.io.InvalidClassException:org.mule.transformer.types.SimpleDataType;本地类不兼容:流classdesc serialVersionId=734974842501135657,本地类serialVersionId=639474018424896880
位于java.io.ObjectStreamClass.InitNoProxy(ObjectStreamClass.java:617)
位于java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1622)
位于java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1517)
+3个以上(为所有内容设置调试级别日志或“-Dmule.verbose.exceptions=true”)

你完全正确。这根本不应该是个问题。然而,Java在序列化方面有最佳实践——不要将看起来完全相同的serialVersionUID属性添加到类中的不兼容类混合在一起。通常开发人员不会注意它,但当他们注意到它时,就意味着类是真正不同的

这实际上意味着您不能使用序列化来传递数据。你的案子就是一个很好的例子

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

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

或者,您可以使用Mule支持打开版本不兼容的问题。然而,我怀疑他们是否会出于同样的原因修复它——类是不同的,这是它们存在的良好原因。

此问题已修复

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

通过将此NullSessionHandler传递给HTTP连接器,可以修复此问题,因为我们不关心该头

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

感谢您的关注。我没有做任何序列化,但我相信Mule正在对它进行内部序列化,所以我不知道如何摆脱它。我也不确定换一个骡子班是个好主意。我可能会请骡子给我建议。再次感谢!