SOAP headers 在 Camel-CXF 中是如何处理的?

How are SOAP headers processed in Camel-CXF?

我正在尝试使用 Jboss Fuse 6.2.1 围绕 Apache Camel,但我不明白 SOAP headers 是如何被处理的。

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

组成

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);

但每当我尝试它时,它总是 return 为空。当我终于发现 Message-body 包含同时包含我的 SOAP-header 和我的 SOAP-body.

的 MessageContentsList-object 时,我浪费了几个小时寻找所有错误的地方
Message inMessage = e.getIn();
AuthHeader header = inMessage.getBody(AuthHeader.class);
Input body = inMessage.getBody(Input.class);

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

一切都取决于您喜欢使用哪种数据格式,例如:如果您使用 dataFormat=MESSAGE。然后你将能够在你的交换中看到整个传入消息,基本上包括 headers 在内的整个消息将以字符串形式出现。您可以使用 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 端点并将数据格式设置为 'PAYLOAD'。 (基本上在 PAYLOAD 中,您将获得肥皂 body 作为交换 body,在 headers 中休息)我相信,您将能够使用 getHeaders( ).

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

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/

祝你好运

我相信我已经找到了我最初问题的答案:

根据文档,我现在了解到,当使用 POJO 作为数据格式时,consumer-endpoint 查看请求的方法在我的 SEI[=17 中有哪些参数=](服务端点接口(serviceClass-attribute 指向的接口。))

然后将这些参数调用到 Message-body (MessageContentsList-object) 中,这将解释为什么 header 和 body 都存在。