当前位置: 首页 > 知识库问答 >
问题:

camel cxf有效负载模式拦截器抛出组织。阿帕奇。骆驼组成部分cxf。CxfPayload无法转换为javax。xml。使改变

黄俊智
2023-03-14

我正在使用同事编写的CXF拦截器将第三方webservice所需的soap头添加到由xsl文件创建的apache camel消息的soap信封中。截击机在我的同事的路线上正常工作,但在我的路线上却失败了。我直接从他的路线复制了我的endpoint,所以我认为这不是问题所在。我问我的同事,他从未见过这样的事情。

我的路线是:

<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]

在堆栈跟踪中,似乎实际的异常是在CXF本身中引发的。似乎在发生异常时,CXF正在执行任何需要的内部处理,以继续发送请求。

互联网上似乎没有那么多关于这个问题的信息,我唯一得到的信息是邮件列表存档中的一条旧的未回复邮件。我是否做错了什么,这可能是CXF中一个模糊的bug,还是我完全遗漏了其他什么。

共有1个答案

阎建中
2023-03-14

我的团队遇到了类似的问题我也看到了那个邮件列表

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

最初我们使用dataFormat。PAYLOAD at our from("cxf: bean:")和dataFormat。RAW at our to("cxf: bean:")。在两个endpoint使用dataFormat。PAYLOAD解决了这个问题。

 类似资料:
  • 我正在尝试通过angle 4上传一个带有pdf文件的表单 该请求是一个多部分/表单数据请求 我正在使用springboot、apachecamelservlet,我的路径是 在我的处理器中 然后我正在尝试写入如下文件: 无论我怎么尝试,文件总是被破坏。无法在Acrobat reader中打开。

  • 我试图使用Apache Camel Quartz2实现一个调度器,它每分钟执行一次路由,并按预期执行一些任务。我使用spring DSL实现与apache camel相关联的路由,如下所示: 根据日志,它不会记录为路由记录的消息,例如Direct:DomainsWithFTPUsers等等。请指导如何实现同样的目标。

  • 遵循官方文件(https://camel.apache.org/manual/component-dsl.html#_using_component_dsl)我创建了以下代码: 但是中的告诉我: 并且中的特性不建议导入相应的库。 有人能给我指出正确的方向吗? 我必须理解的概念才能做到这一点吗?

  • 考虑到apache Camel,我有一个问题:是否可以通过代码来创建全局拦截器,例如AOP?拦截器应该跳过endpoint还是模仿endpoint? 提前致谢

  • 我们需要的是直接的API来设置和使用集群消息队列。我们最初的计划是使用Camel在集群JMS或ActiveMQ队列上进行消费/生产。Kafka如何使这项任务变得更容易?在任何一种情况下,应用程序本身都将在WebLogic服务器上运行。 消息传递将是点对点类型,其中有多个相同服务的实例在运行,但根据负载平衡策略,只有一个实例应该处理消息并发出结果。消息队列也是群集的,因此服务实例或队列实例的失败都不

  • 我对骆驼生产商有很好的了解,但我不能对各种骆驼消费者保持清醒的头脑。特别是事件驱动消费者和轮询消费者,camel如何知道为这些消费者调用回调? 消费者的一般流量是多少?