gpt4 book ai didi

java - 使用 dataFormat 作为 POJO 通过 Camel 调用 Web 服务时无法设置 SOAP header

转载 作者:行者123 更新时间:2023-12-02 13:28:45 25 4
gpt4 key购买 nike

我在我们的项目中使用Camel并请求WebServices,数据格式是POJO。当我的 SOAP 消息不包含 SOAP header 时,我能够发出请求,但当它包含 header 时,我无法设置这些 header 。我查看了文档,但无法理解并有几个问题。

我想创建一条如下所示的消息:

<soapenv:Envelope`enter code here`
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Header>
<platformMsgs:documentInfo
xmlns:platformMsgs="urn:messages_2015_1.platform.webservices.netsuite.com">
<platformMsgs:nsId>WEBSERVICES_3479023</platformMsgs:nsId>
</platformMsgs:documentInfo>
</soapenv:Header>
<soapenv:Body>
<addListResponse
xmlns="">
<platformMsgs:writeResponseList
xmlns:platformMsgs="urn:messages_2015_1.platform.webservices.netsuite.com">
<platformCore:status isSuccess="true"
xmlns:platformCore="urn:core_2015_1.platform.webservices.netsuite.com"/>
<platformMsgs:writeResponse>
<platformCore:status isSuccess="false"
xmlns:platformCore="urn:core_2015_1.platform.webservices.netsuite.com">
<platformCore:statusDetail type="ERROR">
<platformCore:code>DUP_ENTITY</platformCore:code>
<platformCore:message>This entity already exists.</platformCore:message>
</platformCore:statusDetail>
</platformCore:status>
</platformMsgs:writeResponse>
</platformMsgs:writeResponseList>
</addListResponse>`enter code here`
</soapenv:Body>
</soapenv:Envelope>

如果只有正文,我将能够发送消息,但是有人可以给我一个包含标题部分的代码片段吗?数据格式为POJO。

最佳答案

当使用dataFormat为POJO的CXF端点时,Camel Exchange对象中的body是org.apache.cxf.message.MessageContentsList的对象。它是 java.util.ArrayList<Object> 的扩展它按照 WSDL 中定义的顺序包含 SOAP 消息的各个部分以及 WebService 类中的相应方法。元素 0 有一个 Body。

因此,使用 Java 实现此目的的一种方法是创建一个实现 org.apache.camel.Processor 的 Processor 类。接口(interface)及其 process方法设置您的 SOAP header 。像这样的东西:

@Override
public void process(Exchange camelExchange) throws Exception {

MessageContentsList messageBody = (MessageContentsList) camelExchange.getIn().getBody();

DocumentInfo docInfoHeader = new DocumentInfo();
... set docInfoHeader properties ...
messageBody.add(docInfoHeader);

}

(示例未经过测试。这只是一个想法,如何处理...)

您可以在这里找到类似问题的其他答案:Setting Custom Soap Header-To Pojo Message In Camel Cxf

它描述了如何使用 Camel Exchange header 作为 SOAP header 。

我不确定 100% 哪种方式适合您,哪种方式更好......我想,这取决于您使用的 WSDL。

UPD:第二个选择是使用 CxfMessageSoapHeaderOutInterceptor 来使用纯 CXF 解决方案自定义实现。 它可能看起来像:

public class MyCxfInterceptor extends CxfMessageSoapHeaderOutInterceptor {
@Override
public void handleMessage( org.apache.cxf.binding.soap.SoapMessage message) {

org.apache.cxf.binding.soap.SoapHeader myCustomHeader = new org.apache.cxf.binding.soap.SoapHeader(new QName(
{custom name space}, {custom local name}), {Custom content object}));

myCustomHeader.setMustUnderstand(true);

message.getHeaders().add(myCustomHeader);

}

并将 Camel Cxf Endpoint 中的拦截器设置为:

<cxfEndpoint ...>
<outInterceptors>
<spring:bean class="MyCxfInterceptor"/>
</outInterceptors>
...

关于java - 使用 dataFormat 作为 POJO 通过 Camel 调用 Web 服务时无法设置 SOAP header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43284087/

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