camel cxf payload mode interceptor throws org.apache.camel.component.cxf.CxfPayload无法强制转换为javax.xml.transform

时间:2015-02-06 23:48:45

标签: java web-services cxf apache-camel

我正在使用由同事编写的CXF-Interceptor将第三方Web服务所需的soap标头添加到由xsl文件创建的apache camel消息的soap信封中。拦截器对我的同事正常工作,在他的路线上然而在我的同事上它失败了。我直接从他的路线复制我的端点,所以我认为这不是问题。我问我的同事,他从来没有见过这样的事情。

我的路线是:

<to uri="bean:applicationName?method=setBodyToBlankXML" />
<to uri="xslt:xsl/applicationName-thirdPartyWebserviceOperationName.xsl" />
<setHeader headerName="operationName">
<constant>OperationName</constant>
</setHeader>
<setHeader headerName="operationNamespace">
<constant>thirdPartyNamespace</constant>
</setHeader>
<to uri="cxf:bean:thirdPartyWebserviceBean" />

他的路线是:

<to uri="bean:applicationName?method=setBodyToBlankXML" />
                        <to uri="xslt:xsl/applicationName-thirdPartyWebserviceOperationName.xsl" />
                        <log message="Display Request ${body}" loggingLevel="INFO" />
                        <to uri="cxf:bean:thirdPartyWebserviceBean" />

完整堆栈跟踪是:

java.lang.ClassCastException: org.apache.camel.component.cxf.CxfPayload cannot be cast to javax.xml.transform.Source
    at org.apache.cxf.databinding.source.XMLStreamDataWriter.write(XMLStreamDataWriter.java:79) ~[cxf-core-3.0.2.jar:3.0.2]
    at org.apache.cxf.databinding.source.XMLStreamDataWriter.write(XMLStreamDataWriter.java:54) ~[cxf-core-3.0.2.jar:3.0.2]
    at org.apache.camel.component.cxf.HybridSourceDataBinding$1.write(HybridSourceDataBinding.java:100) ~[camel-cxf-2.14.1.jar:2.14.1]
    at org.apache.camel.component.cxf.HybridSourceDataBinding$1.write(HybridSourceDataBinding.java:81) ~[camel-cxf-2.14.1.jar:2.14.1]
    at org.apache.cxf.binding.soap.interceptor.SoapOutInterceptor.handleHeaderPart(SoapOutInterceptor.java:256) ~[cxf-rt-bindings-soap-3.0.2.jar:3.0.2]
    at org.apache.cxf.binding.soap.interceptor.SoapOutInterceptor.writeSoapEnvelopeStart(SoapOutInterceptor.java:177) ~[cxf-rt-bindings-soap-3.0.2.jar:3.0.2]
    at org.apache.cxf.binding.soap.interceptor.SoapOutInterceptor.handleMessage(SoapOutInterceptor.java:87) ~[cxf-rt-bindings-soap-3.0.2.jar:3.0.2]
    at org.apache.cxf.binding.soap.interceptor.SoapOutInterceptor.handleMessage(SoapOutInterceptor.java:67) ~[cxf-rt-bindings-soap-3.0.2.jar:3.0.2]
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307) ~[cxf-core-3.0.2.jar:3.0.2]
    at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:514) [cxf-core-3.0.2.jar:3.0.2]
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:416) [cxf-core-3.0.2.jar:3.0.2]
    at org.apache.camel.component.cxf.CxfProducer.process(CxfProducer.java:112) [camel-cxf-2.14.1.jar:2.14.1]
    at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:120) [camel-core-2.14.1.jar:2.14.1]
    at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:72) [camel-core-2.14.1.jar:2.14.1]
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:416) [camel-core-2.14.1.jar:2.14.1]
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191) [camel-core-2.14.1.jar:2.14.1]
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:118) [camel-core-2.14.1.jar:2.14.1]
    at org.apache.camel.processor.Pipeline.access$100(Pipeline.java:43) [camel-core-2.14.1.jar:2.14.1]
    at org.apache.camel.processor.Pipeline$1.done(Pipeline.java:136) [camel-core-2.14.1.jar:2.14.1]
    at org.apache.camel.processor.CamelInternalProcessor$InternalCallback.done(CamelInternalProcessor.java:251) [camel-core-2.14.1.jar:2.14.1]
    at org.apache.camel.impl.MDCUnitOfWork$MDCCallback.done(MDCUnitOfWork.java:231) [camel-core-2.14.1.jar:2.14.1]
    at org.apache.camel.processor.RedeliveryErrorHandler$1.done(RedeliveryErrorHandler.java:428) [camel-core-2.14.1.jar:2.14.1]
    at org.apache.camel.management.InstrumentationProcessor$1.done(InstrumentationProcessor.java:81) [camel-core-2.14.1.jar:2.14.1]
    at org.apache.camel.processor.SendProcessor$1.done(SendProcessor.java:131) [camel-core-2.14.1.jar:2.14.1]
    at org.apache.camel.component.cxf.CxfClientCallback.handleResponse(CxfClientCallback.java:61) [camel-cxf-2.14.1.jar:2.14.1]
    at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:819) [cxf-core-3.0.2.jar:3.0.2]
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1638) [cxf-rt-transports-http-3.0.2.jar:3.0.2]
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream$1.run(HTTPConduit.java:1145) [cxf-rt-transports-http-3.0.2.jar:3.0.2]
    at org.apache.cxf.workqueue.AutomaticWorkQueueImpl$3.run(AutomaticWorkQueueImpl.java:428) [cxf-core-3.0.2.jar:3.0.2]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_25]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_25]
    at org.apache.cxf.workqueue.AutomaticWorkQueueImpl$AWQThreadFactory$1.run(AutomaticWorkQueueImpl.java:353) [cxf-core-3.0.2.jar:3.0.2]
    at java.lang.Thread.run(Thread.java:745) [na:1.8.0_25]

对堆栈跟踪进行Anylzing,看起来实际异常是在CXF本身内引发的。看来,在发生异常时,CXF正在进行向前发送请求所需的任何内部处理。

在互联网上似乎没有关于这个问题的那么多信息,我得到的唯一信息是邮件列表档案中一条旧的未答复的消息。我做错了什么,这可能是CXF中一个不起眼的错误,还是还有一些我完全不知道的错误。

1 个答案:

答案 0 :(得分:0)

我的团队遇到了类似的问题,我也看到了 mailing list

我们的解决方案是对生产者和消费者使用相同的数据格式。

最初我们在 from("cxf:bean:") 使用 dataFormat.PAYLOAD,在 to("cxf:bean:") 使用 dataFormat.RAW。在两个端点使用 dataFormat.PAYLOAD 解决了这个问题。