2017-01-19 8 views
0

Mule 3.2.2からMule 3.7.1へのサービスコール中に、次の例外が発生します。Mule ESBのシリアル化互換性のエラー

org.mule.transformer.types.SimpleDataTypeクラスのserialverは両方のランタイムで異なりますが、なぜこれが問題であるかわかりません。とにかくオブジェクトはSOAP要求にシリアル化されているためです。

ご協力いただきましてありがとうございます。ミュール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

あなたは絶対的に正しいです。それはまったく問題ではありません。しかし、Javaにはシリアライゼーションのベストプラクティスがあります。つまり、まったく同じserialVersionUID属性を持つ互換性のないクラスを混在させないでクラスに追加します。通常、開発者はそれに注意を払っていませんが、そうするときにはクラスが本当に異なっていることを意味します。

実際には、シリアル化を使用してデータを渡すことはできません。あなたのケースは非常に良い例です。

この問題を解決するには、シリアライゼーションを廃止する必要があります。このクラスは、この2つのバージョンのMuleでは異なります。

もう1つの選択肢は、クラスをより安定したものに置き換えることです。独自のSimpleDataTypeを作成することもできます。

また、バージョン非互換性のためにMuleサポートでチケットを開くこともできます。しかし、私は彼らが同じ理由でそれを修正するのではないかと疑う - クラスは異なっており、なぜそうであるのが良い理由だった。

+0

ありがとうございます。私はシリアル化をしていませんが、私はMuleが内部的にそれをシリアル化していると信じていますので、どうやってそれを取り除くのか分かりません。私はMuleクラスを代用することをお勧めします。私はおそらくムールに助言を求めるでしょう。再度、感謝します! – Kgan

0

この問題は修正されました。

Mule documentationに記載されているように、3.7.1ランタイムのセッション変数はSimpleDataType.classにラップされ、このシリアル化されたBase64エンコード文字列はMULE_SESSIONヘッダーとして別のランタイムに渡されました。クラスのバージョンが異なるため、もう1つのランタイムがこのヘッダーを逆シリアル化すると、エラーがスローされます。

このヘッダーを気にしなかったので、このNullSessionHandlerをHTTPコネクタに渡すことで修正されました。

<service-overrides sessionHandler="org.mule.session.NullSessionHandler"/> 
関連する問題