2017-01-19 2 views
0

Mule 3.2.2에서 Mule 3.7.1로 서비스 호출을하는 동안 다음 예외가 발생합니다.Mule ESB 직렬화 호환되지 않는 오류

org.mule.transformer.types.SimpleDataType 클래스의 serialver가 두 런타임에서 다르지만 왜 이것이 문제인지 잘 모르겠습니다. Object가 어쨌든 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 특성을 보이는 호환되지 않는 클래스를 혼합하지 않으려면 클래스에 추가됩니다. 보통 개발자는주의를 기울이지 않지만 그들이 할 때는 클래스가 실제로 다르다는 것을 의미합니다.

실제로 이는 데이터를 전달하기 위해 직렬화를 사용할 수 없다는 것을 의미합니다. 당신의 경우는 아주 좋은 예입니다.

이 문제를 해결하려면 직렬화를 제거해야합니다.이 클래스는 두 버전의 Mule에서 서로 다릅니다.

또 다른 옵션은 클래스를 좀 더 안정적인 것으로 대체하는 것입니다. 자신 만의 SimpleDataType을 만들 수도 있습니다.

또는 버전 비 호환성에 대한 Mule 지원 티켓을 열 수 있습니다. 그러나 나는 그들이 같은 이유로 그것을 고칠 수 있을지 의심 스럽다. 수업은 다르며, 왜 그런지 이유가있다.

+0

감사합니다. 어떤 직렬화도하고 있지 않지만 Mule이 내부적으로 직렬화를 수행하여 그것을 제거하는 방법을 모르겠습니다. 나는 또한 Mule 클래스를 대체하는 것이 좋은 생각인지 잘 모르겠습니다. 나는 Mule에게 조언을 요청할 것입니다. 다시 한 번 감사드립니다! – Kgan

0

이 문제는 해결되었습니다.

Mule documentation에서 설명한 것처럼 3.7.1 런타임의 세션 변수가 SimpleDataType.class로 래핑되고이 직렬화 된 Base64 인코딩 문자열이 다른 런타임에 MULE_SESSION 헤더로 전달되었습니다. 클래스 버전이 다르기 때문에 다른 런타임에서이 헤더를 deserialize하면 오류가 발생합니다.

이 헤더에 대해 신경 쓰지 않았으므로이 NullSessionHandler를 HTTP 커넥터에 전달하여 고정되었습니다.

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