简体   繁体   English

封送SOAP CXF Web服务请求的问题

[英]Issue with marshalling of SOAP CXF webservice request

I am calling a SOAP webserive using 我正在使用SOAP Webserive

I am facing an issue with WebService request call, where the request string (XML) is getting formatted while send. 我遇到WebService请求调用的问题,其中发送时请求字符串(XML)的格式已格式化。

Expected Request: 预期要求:

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

Actual Request Sent: 已发送的实际请求:

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

I am using Apache CXF (SOAP) for webservice call. 我正在使用Apache CXF(SOAP)进行Web服务调用。 Marshaling of Java Object is handled internally by CXF and JAXB libraries. Java对象的封送处理由CXF和JAXB库在内部处理。

Has anyone faced such issue where elements inside <[CDATA[ ]]> gets formatted during marshaling or How to fix this ? 有没有人遇到过这样的问题,即在编组过程中<[CDATA []]>中的元素被格式化或如何解决?

I found the solution using 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);
        }
    }
}

Where CDataXMLStreamWriter extends DelegatingXMLStreamWriter 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();
        }

    }

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM