当前位置: 首页 > 知识库问答 >
问题:

使用dataFormat作为POJO通过Camel调用Web服务时无法设置SOAP标头

汪德寿
2023-03-14

我在我们的项目中使用Camel并请求WebServices,dataFormat是POJO。当我的SOAP消息不包含SOAP标头时,我能够请求,但是当它有标头时,我无法设置它们。我看了看留档,但无法理解,有几个问题。

我想创建如下消息:

<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。

共有2个答案

杨腾
2023-03-14

假设我请求Web服务,但它失败了,就会生成一条错误消息。那么,我是否也会在MessageContentsList的位置0处获取错误对象?或者我将只获得位置0处的响应对象?

廖君昊
2023-03-14

当使用带有dataFormat的CXFendpoint作为POJO时,Camel Exchange对象中的body是org.apache.cxf.message.MessageContentsList的对象。它是java.util.ArrayList的扩展

因此,使用Java的一种方法是创建一个实现org.apache.camel.处理器接口的处理器类,并在其进程方法中设置您的SOAP标头。类似:

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

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

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

}

(样品未测试。这只是一个想法,如何处理...)

您可以在这里找到关于类似问题的其他答案:在Camel Cxf中将自定义Soap头设置为Pojo消息

它描述了如何将Camel交换头用作SOAP头。

我不能百分之百确定哪种方法对你有效,哪种更好。。。我想,这取决于您使用的WSDL。

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

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 Cxfendpoint中的拦截器设置为:

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

 类似资料:
  • 我正在尝试将Apache CXF与Apache Camel集成。骆驼的配置: 现在,为了调用web服务上的特定操作,我使用以下方法: 但是在包含上述配置后,我得到< code > WARN servlet controller:149-在服务器控制台上找不到对http://localhost:8080/cxf service/services/cxfAuth的Observer的请求,并且在浏览器上

  • 我是Apache Camel的新手,我使用Red Hat Code准备工作室12.16.0.GA.我想调用肥皂网络服务。我用过这个例子https://tomd.xyz/camel-consume-soap-service/ 这是我的camel上下文文件 这是我的输入bean 围绕它有许多问题。首先,我不能将输入参数传入主体。我试着像这样设置身体 但没有得到响应或只是没有记录。我已经尝试使用bean

  • 我正在尝试从Spring Boot调用SOAP Web服务,但我遇到了问题。我使用maven-jaxb2-plugin从这个WSDL自动生成了类: 遵循本指南:https://spring.io/guides/gs/consuming-web-service/ 我还创建了SOAP客户端来调用TR069CheckDevice可用性。 我的客户端类如下所示: 我的SoapClient配置类是: 问题是

  • 我希望通过java将soap web服务与此wsdl一起使用: https://sadad.shaparak.ir/services/MerchantUtility.asmx?wsdl 但当我运行某些方法时会发生此错误: 访问WSDL失败:https://sadad.shaparak.ir/services/MerchantUtility.asmx?wsdl.失败的原因是:sun.security

  • 我对cxf soap头有问题。我使用Contract-firs开发方法建立了一个cxf项目。我想调用带有cxf组件的web服务,如下所示。 我想发送一个pojo消息,抛出一个直接组件作为对ws的请求。我的路线如下所示: 我需要实现这样一个soap头: 为了将其归档,我编写了一个这样的处理器(另请参见http://camel.apache.org/cxf.html): 不幸的是,我在这条语句中得到了

  • 我需要从REST服务调用SOAP Webservice。我在我的项目中使用Spring集成。目前,我正在使用基于xml的配置来实现目标。但我想用java dsl编写代码。请帮助我如何使用Spring集成DSL从REST服务调用SOAP服务。 一个例子会很有帮助。