使用dataFormat作为POJO

时间:2017-04-07 17:37:59

标签: java web-services soap apache-camel cxf

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

我想创建如下消息:

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

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

2 个答案:

答案 0 :(得分:1)

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

因此,使用Java执行此操作的一种方法是创建一个实现org.apache.camel.Processor接口的Processor类,并在其process方法中设置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);

}

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

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

它描述了如何将Camel Exchange标头用作SOAP标头。

我不确定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中的Interceptor设置为:

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

答案 1 :(得分:0)

假设我请求Web服务并且失败,则会生成Fault消息。我也会在MessageContentsList的位置0获得Fault对象吗?或者我只能获得位置0的响应对象?