我正试图用Jboss 6.2.1来处理Apache,我不明白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>蓝图
<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和输入?我在文档中看到的每个示例都表明,我应该能够通过执行以下操作来提取标题:
exchange.getIn().getHeaders(//insert your favorite parameter here);但是,每当我尝试时,它总是返回null。当我终于发现消息体包含了MessageContentsList对象,同时保存着我的SOAP头和我的SOAP-body时,我浪费了几个小时查找所有错误的地方。
Message inMessage = e.getIn();
AuthHeader header = inMessage.getBody(AuthHeader.class);
Input body = inMessage.getBody(Input.class);有人能解释一下为什么和什么时候会发生这种事吗?
发布于 2016-06-08 07:07:28
我想我已经找到了我最初问题的答案:
根据我现在了解的文档,当使用POJO作为数据格式时,使用者端点会查看请求的方法在我的(serviceClass接口(serviceClass-属性点)中有哪些参数)。
然后将这些参数调用到MessageContentsList-object (MessageContentsList-object)中,这将解释为什么头部和正文都存在。
发布于 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/
祝好运
https://stackoverflow.com/questions/37673372
复制相似问题