java - Camel-CXF 中如何处理 SOAP header ?

标签 java apache-camel cxf jbossfuse blueprint-osgi

我正在尝试使用 Jboss Fuse 6.2.1 来理解 Apache Camel,但我不明白 SOAP header 是如何处理的。

我有一个 WSDL,从中我为输入和输出消息生成了类。输入由 header 和正文组成,而输出仅由正文组成。

WSDL

<wsdl:types>
    <xs:schema targetNamespace="http://cxftestserver.blueprint.me.com">
        <xs:element name="input">
            <xs:complexType>
                <xs:sequence>
                    <xs:element type="xs:string" name="Id" />
                    <xs:element type="xs:string" name="Name" />
                </xs:sequence>
            </xs:complexType>
        </xs:element>
        <xs:element name="output">
            <xs:complexType>
                <xs:sequence>
                    <xs:element type="xs:string" name="Code" />
                </xs:sequence>
            </xs:complexType>
        </xs:element>
    </xs:schema>
    <xs:schema targetNamespace="http://cxftestserver.blueprint.me.com/authentication">
        <xs:element name="authHeader">
            <xs:complexType>
                <xs:sequence>
                    <xs:element type="xs:string" name="username" />
                    <xs:element type="xs:string" name="password" />
                </xs:sequence>
            </xs:complexType>
        </xs:element>
    </xs:schema>
</wsdl:types>

<wsdl:message name="inputTest">
    <wsdl:part name="header" element="tns1:authHeader" />
    <wsdl:part name="body" element="tns:input" />
</wsdl:message>
<wsdl:message name="outputTest">
    <wsdl:part name="out" element="tns:output" />
</wsdl:message>

蓝图

<bean id="myProcessor" class="com.me.blueprint.cxftestserver.MyProcessor" />

<cxf:cxfEndpoint id="test-ws" address="/Test" serviceClass="com.me.blueprint.cxftestserver.TestEndpoint" />

<camel:camelContext>
    <camel:route>
        <camel:from uri="cxf:bean:test-ws" />
        <camel:process ref="myProcessor" />
    </camel:route>
</camel:camelContext>

我现在不明白的是为什么Exchange内部的Message-body同时包含authHeader和input?我在文档中读到的每个示例都表明我应该能够通过执行以下操作来提取 header :

exchange.getIn().getHeaders(//insert your favorite parameter here);

但每当我尝试它总是返回 null。当我最终发现 Message-body 包含同时包含 SOAP header 和 SOAP-body 的 MessageContentsList 对象时,我浪费了几个小时寻找所有错误的位置。

Message inMessage = e.getIn();
AuthHeader header = inMessage.getBody(AuthHeader.class);
Input body = inMessage.getBody(Input.class);

有人可以向我解释一下为什么以及何时发生这种情况吗?

最佳答案

一切都取决于您喜欢使用的数据格式,例如:如果您使用 dataFormat=MESSAGE。然后您将能够在交换中看到整个传入消息,基本上包括 header 的整个消息都将以字符串形式出现。您可以使用 xpath 立即处理它。

Refer this example for dataFormats - https://github.com/gnanagurus/camel-guru-projects/blob/master/camel-cxf-geocoder-example/src/main/resources/META-INF/spring/beans-config.xml

但是他们的建议也是正确的,您可以使用 getHeaders() 提取它。您可以尝试按照本例中提到的方式配置 CXF 端点并将 dataFormat 设置为“PAYLOAD”。 (基本上在 PAYLOAD 中,您将获得肥皂体作为交换体,其余在 header 中)我确信,您将能够使用 getHeaders() 读取 header 。

此外,您使用服务类定义 CXF 端点/为什么必须生成类是否有原因。如果你有理由忽略它,我倾向于避免使用camel项目中的类,而是尽量使用XML本身的框架功能。如果您想使用camel公开基于SOAP的Web服务端点,您不必自己生成任何类 - 这个示例可以引导/帮助您:

https://github.com/gnanagurus/camel-guru-projects/tree/master/camel-cxf-geocoder-example

Description about the above example: http://bushorn.com/camel-web-services-expose-them/

祝你好运

关于java - Camel-CXF 中如何处理 SOAP header ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37673372/

相关文章:

java - apache cxf 客户端初始化缓慢

xsd - 使用 jaxb 从我的类路径中的 xsd 生成源代码

java - 未获取 Web 服务响应中值为 "null"的元素

Java 缓存和 HashMap

java - Instant Messenger,Java 基础项目

java - Camel 中的正则表达式匹配器

java - header 中的 Camel Split list<MyObject>

java - 使用 Apache Camel 的简单 HTTPS 代理服务器

java - Web服务命名空间共享

java - 为什么 pack() 会缩小框架?