【问题标题】:Issue with marshalling of SOAP CXF webservice requestSOAP CXF Web 服务请求的编组问题
【发布时间】:2016-11-01 06:11:45
【问题描述】:

我正在使用

调用 SOAP 网络服务器

我遇到了 WebService 请求调用的问题,其中请求字符串 (XML) 在发送时被格式化。

预期要求:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns2:serviceRequest xmlns:ns2="urn:example.com/xml/schemas/v1_0/">
<referenceNum>5361610270000002</referenceNum>
<client>ABCD</client>
<serviceName>GET.PERSONAL.DETAIL</serviceName>
<UserId>USER_1234</UserId>
<data><![CDATA[<ns2:getDetailRequest xmlns:ns2="urn:example.com/xml/schemas/v1_0/">
<HEADER>
<serviceName>GET.PERSONAL.DETAIL</serviceName>
<serviceType>SYNC</serviceType>
<serviceVersion>1.0</serviceVersion>
</HEADER>
</ns2:getDetailRequest>]]>
</data>
</ns2:serviceRequest>
</soap:Body>
</soap:Envelope>

发送的实际请求:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns2:serviceRequest xmlns:ns2="urn:example.com/xml/schemas/v1_0/">
<referenceNum>5361610270000002</referenceNum>
<client>ABCD</client>
<serviceName>GET.PERSONAL.DETAIL</serviceName>
<UserId>USER_1234</UserId>
<data>&lt;![CDATA[&lt;ns2:getDetailRequest xmlns:ns2="urn:example.com/xml/schemas/v1_0/"&gt;
&lt;HEADER&gt;
&lt;serviceName&gt;GET.PERSONAL.DETAIL&lt;/serviceName&gt;
&lt;serviceType&gt;SYNC&lt;/serviceType&gt;
&lt;serviceVersion&gt;1.0&lt;/serviceVersion&gt;
&lt;/HEADER&gt;
&lt;/ns2:getAccountDetailRequest&gt;]]&gt
</data>
</ns2:serviceRequest>
</soap:Body>
</soap:Envelope>

我正在使用 Apache CXF (SOAP) 进行 Web 服务调用。 Java 对象的编组由 CXF 和 JAXB 库在内部处理。

有没有人遇到过这样的问题,即 中的元素在编组期间被格式化或如何解决这个问题?

【问题讨论】:

    标签: java web-services soap jaxb cxf


    【解决方案1】:

    我使用 Interceptor 找到了解决方案。

    public class CustomSoapCxfInterceptor extends AbstractSoapInterceptor {
    
        public CustomSoapCxfInterceptor() {
            super(Phase.PRE_STREAM);
            getAfter().add(AttachmentOutInterceptor.class.getName());
    
        }
    
        @Override
        public void handleMessage(SoapMessage message) {
            try {
                message.put("disable.outputstream.optimization", Boolean.TRUE);
                XMLStreamWriter writer = StaxUtils.createXMLStreamWriter(message.getContent(OutputStream.class));
    
                CDataXMLStreamWriter cDataXMLStreamWriter = new CDataXMLStreamWriter(writer);
                message.setContent(XMLStreamWriter.class, cDataXMLStreamWriter);
            } catch (Exception exception) {
                DefaultLogger.error(exception);
            }
        }
    }
    

    CDataXMLStreamWriter 扩展 DelegatingXMLStreamWriter 的地方

    public class CDataXMLStreamWriter extends DelegatingXMLStreamWriter {
    
        private int counter = 1;
    
        private String currentElementName;
    
        public CDataXMLStreamWriter(XMLStreamWriter del) {
            super(del);
        }
    
        @Override
        public void writeCharacters(String text) throws XMLStreamException {
            boolean useCData = checkIfCDATAneededForCurrentElement();
            if (useCData) {
                super.writeCData(text);
            } else {
                super.writeCharacters(text);
            }
        }
    
        private boolean checkIfCDATAneededForCurrentElement() {
            if ("data".equals(currentElementName))
                return true;
            return false;
        }
    
        public void writeStartElement(String prefix, String local, String uri) throws XMLStreamException {
            currentElementName = local;
            super.writeStartElement(prefix, local, uri);
        }
    
        @Override
        public void writeEndElement() throws XMLStreamException {
            if ("data".equals(currentElementName)) {
                if (this.counter == 1) {
                    super.writeEndElement();
                }
                this.counter++;
            } else {
                super.writeEndElement();
            }
    
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多