首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Camel-CXF中处理SOAP头?

如何在Camel-CXF中处理SOAP头?
EN

Stack Overflow用户
提问于 2016-06-07 07:43:38
回答 2查看 1.7K关注 0票数 1

我正试图用Jboss 6.2.1来处理Apache,我不明白SOAP头是如何处理的。

我有一个WSDL,它为我的输入和输出消息生成了类。输入由标题和主体组成,而输出仅由主体组成。

WSDL

代码语言:javascript
复制
<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>

蓝图

代码语言:javascript
复制
<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中的消息主体同时包含authHeader和输入?我在文档中看到的每个示例都表明,我应该能够通过执行以下操作来提取标题:

代码语言:javascript
复制
exchange.getIn().getHeaders(//insert your favorite parameter here);

但是,每当我尝试时,它总是返回null。当我终于发现消息体包含了MessageContentsList对象,同时保存着我的SOAP头和我的SOAP-body时,我浪费了几个小时查找所有错误的地方。

代码语言:javascript
复制
Message inMessage = e.getIn();
AuthHeader header = inMessage.getBody(AuthHeader.class);
Input body = inMessage.getBody(Input.class);

有人能解释一下为什么和什么时候会发生这种事吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-08 07:07:28

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

根据我现在了解的文档,当使用POJO作为数据格式时,使用者端点会查看请求的方法在我的(serviceClass接口(serviceClass-属性点)中有哪些参数)。

然后将这些参数调用到MessageContentsList-object (MessageContentsList-object)中,这将解释为什么头部和正文都存在。

票数 1
EN

Stack Overflow用户

发布于 2016-06-08 00:19:48

这都取决于您喜欢使用什么dataFormat,例如:如果您使用dataFormat=MESSAGE。然后,您将能够在您的交换中看到整个传入消息,基本上,包括标题在内的整个消息将以字符串的形式传入。您可以使用xpath立即处理它。

有关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成为“有效负载”。(基本上在有效负载中,您将soap主体作为交换体,rest在头中)我确信,您将能够使用getHeaders()读取您的头。

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

https://github.com/gnanagurus/camel-guru-projects/tree/master/camel-cxf-geocoder-example 关于上述示例的说明:http://bushorn.com/camel-web-services-expose-them/

祝好运

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37673372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档