在从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)
答案 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"/>