Java 如何在Camel CXF中处理SOAP头?

Java 如何在Camel CXF中处理SOAP头?,java,apache-camel,cxf,jbossfuse,blueprint-osgi,Java,Apache Camel,Cxf,Jbossfuse,Blueprint Osgi,我正试图使用Jboss Fuse 6.2.1来理解ApacheCamel,但我不明白SOAP头是如何处理的 我有一个WSDL,从中我为输入和输出消息生成了类。输入由标题和正文组成,而输出仅由正文组成 WSDL <wsdl:types> <xs:schema targetNamespace="http://cxftestserver.blueprint.me.com"> <xs:element name="input">

我正试图使用Jboss Fuse 6.2.1来理解ApacheCamel,但我不明白SOAP头是如何处理的

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

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>
但每当我尝试时,它总是返回null。我浪费了几个小时寻找所有错误的地方,最终发现消息体包含同时包含SOAP头和SOAP体的MessageContentsList对象

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

有人能给我解释一下发生这种情况的原因和时间吗?

这一切都取决于您喜欢使用什么数据格式,例如:如果您使用dataFormat=MESSAGE。然后您将能够在exchange中看到整个传入消息,基本上整个消息(包括标题)将以字符串的形式传入。您可以使用xpath直接处理它

有关数据格式,请参阅此示例-

但是,无论他们建议什么,您都可以使用getHeaders()提取它。您是否可以尝试配置本例中提到的CXF端点并将dataFormat设置为“PAYLOAD”。(基本上,在有效负载中,您将获得作为exchange主体的soap主体,其余部分位于标题中)我确信,您将能够使用getHeaders()读取标题

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

关于上述示例的说明:


祝你好运

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

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


然后将这些参数调用到消息正文(MessageContentsList对象),这将解释为什么标题和正文都存在。

谢谢您的回答。我应该补充一点,我现在知道在哪里可以找到我的头,所以处理头的方式对我来说不是问题。我只是不明白为什么在消息体中找到头而不是头。我只玩了一个星期左右的Camel,所以我还没有时间去探索所有的数据格式,但肯定会有一些场景,POJO比消息和负载更可取?我认为,这取决于您喜欢的负载类型应该是什么。我总是喜欢在camel中使用xslt,目前,我的大多数服务都是内部的,所以我发现dataformat MESSAGE+xslt是一个不错的选择,它更直观。
exchange.getIn().getHeaders(//insert your favorite parameter here);
Message inMessage = e.getIn();
AuthHeader header = inMessage.getBody(AuthHeader.class);
Input body = inMessage.getBody(Input.class);