在jboss fuse中使用cxf的web服务端点

Nur*_*lan 5 web-services cxf jaxb apache-camel jbossfuse

我正在使用jboss fuse 6.1-final:

这是我简单的路线:

<route>
    <from uri="cxf:bean:synchronousEndpoint"/>
    <log message="Service invoked." />
    <process ref="simpleProcessor"/>
</route>
Run Code Online (Sandbox Code Playgroud)

并且在simpleProcessor我将正确的响应(即相应的JAXB对象)放入上下文中.但是,它以错误回应:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
       <soap:Fault>
           <faultcode>soap:Server</faultcode>
           <faultstring>Marshalling Error: java.lang.Object cannot be cast to org.w3c.dom.Element</faultstring>
       </soap:Fault>
   </soap:Body>
</soap:Envelope>
Run Code Online (Sandbox Code Playgroud)

这是堆栈跟踪:

Caused by: java.lang.ClassCastException: java.lang.Object cannot be cast to org.w3c.dom.Element
Run Code Online (Sandbox Code Playgroud)

有任何提示或建议吗?

Nam*_*ian 0

如果没有看到 simpleProcessor 的更多代码,很难说。但是,您似乎使用了错误的 dataFormat 参数。

cxf 组件有一个 dataFormat 参数,可以是以下任意一个:

  • POJO:POJO(普通旧 Java 对象)是在目标服务器上调用的方法的 Java 参数。支持协议和逻辑 JAX-WS 处理程序。

  • PAYLOAD:PAYLOAD 是应用 CXF 端点中的消息配置后的消息负载(soap:body 的内容)。仅支持协议 JAX-WS 处理程序。不支持逻辑 JAX-WS 处理程序。

  • MESSAGE:MESSAGE 是从传输层接收到的原始消息。它不应该触摸或更改 Stream,如果您使用这种 DataFormat,一些 CXF 拦截器将被删除,因此在不支持camel-cxf消费者和JAX-WS处理程序之后您看不到任何soap标头。

  • CXF_MESSAGE:Camel 2.8.2 中的新增功能,CXF_MESSAGE 允许通过将消息从传输层转换为原始 SOAP 消息来调用 CXF 拦截器的全部功能

默认值是 POJO,这意味着 Camel 传递对象时没有 XML 作为消息传递。我怀疑您可能试图将响应作为 XML 进行操作,这会导致问题。

不久前,我遇到了与此类似的情况,当我收到 POJO 时,我试图通过对 XML 进行 XPATH 查询来将 POJO 转换为 XML。