gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:54:28 25 4
gpt4 key购买 nike

我正在尝试使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com