Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Apache Cxf端点中的Unescape Xml特殊字符_Java_Xml_Apache_Web Services_Cxf - Fatal编程技术网

Java Apache Cxf端点中的Unescape Xml特殊字符

Java Apache Cxf端点中的Unescape Xml特殊字符,java,xml,apache,web-services,cxf,Java,Xml,Apache,Web Services,Cxf,我需要在ApacheCXF端点中返回一个未转换的xml字符串。下面我将粘贴代码的各个部分,返回当前xml字符串和所需的xml字符串: @WebService(endpointInterface = "net.system.soapservice.result.ResultMgrPortType", serviceName = "ResultMgrPortType") public class ResultServiceImpl implements ResultMgrPortType { @O

我需要在ApacheCXF端点中返回一个未转换的xml字符串。下面我将粘贴代码的各个部分,返回当前xml字符串和所需的xml字符串:

@WebService(endpointInterface = "net.system.soapservice.result.ResultMgrPortType", serviceName = "ResultMgrPortType")
public class ResultServiceImpl implements ResultMgrPortType {

@Override
public String genericAPIResult(String resultMsg) {

    Map<String, String> processedResultMsg = DataFormatUtil.parseResultMsg(resultMsg);

    String response = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\">"
            + "<soapenv:Body>"
            + "<req:ResponseMsg"
            + " xmlns:req=\"http://api-v1.gen.mm.vodafone.com/mminterface/request\"><![CDATA[<?xml"
            + " version=\"1.0\""
            + "encoding=\"UTF-8\"?><response"
            + " xmlns=\"http://api-"
            + "v1.gen.mm.vodafone.com/mminterface/response\">"
            + "<ResponseCode>"+processedResultMsg.get("ResultCode")+"</ResponseCode>"
            + "<ConversationID>"+processedResultMsg.get("ConversationID")+"</ConversationID>"
            + "<ResponseDesc>Service result processed successfully.</ResponseDesc>"
            + "<OriginatorConversationID>"+processedResultMsg.get("OriginatorConversationID")+"</OriginatorConversationID>"
            + "<ServiceStatus>0</ServiceStatus>"
            + "</response>]]></req:ResponseMsg>"
            + "</soapenv:Body>"
            + "</soapenv:Envelope>";
    return response;
}
@WebService(endpointInterface=“net.system.soapservice.result.ResultMgrPortType”,serviceName=“ResultMgrPortType”)
公共类ResultServiceImpl实现ResultMgrPortType{
@凌驾
公共字符串genericAPIResult(字符串结果sg){
MapProcessedResultMsg=DataFormatUtil.parseResultMsg(resultMsg);
字符串响应=“”
+ ""
+ ""
+“+processedResultMsg.get(“结果代码”)+”
+“+processedResultMsg.get(“会话ID”)+”
+“已成功处理服务结果。”
+“+processedResultMsg.get(“OriginatorConversationID”)+”
+ "0"
+ "]]>"
+ ""
+ "";
返回响应;
}
}

来自上述端点的xml响应,如我的日志中所示:

ID: 4
Response-Code: 200
Encoding: UTF-8
Content-Type: text/xml
Headers: {}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ResponseMsg xmlns="http://api-v1.gen.mm.vodafone.com/mminterface/result">&lt;soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"&gt;
&lt;soapenv:Body&gt;
&lt;req:ResponseMsg
 xmlns:req="http://api-v1.gen.mm.vodafone.com/mminterface/request"&gt;&lt;![CDATA[&lt;?xml
 version="1.0"
encoding="UTF-8"?&gt;&lt;response
 xmlns="http://api-
v1.gen.mm.vodafone.com/mminterface/response"&gt;&lt;ResponseCode&gt;0&lt;/ResponseCode&gt;&lt;ConversationID&gt;AG_20170411_000059047aba809d6631&lt;/ConversationID&gt;&lt;ResponseDesc&gt;Service result processed successfully.&lt;/ResponseDesc&gt;&lt;OriginatorConversationID&gt;902004_fhltd_60575.0&lt;/OriginatorConversationID&gt;&lt;ServiceStatus&gt;0&lt;/ServiceStatus&gt;&lt;/response&gt;]]&gt;&lt;/req:ResponseMsg&gt;
&lt;/soapenv:Body&gt;
&lt;/soapenv:Envelope&gt;</ResponseMsg></soap:Body></soap:Envelope>  
--------------------------------------
ID:4
响应代码:200
编码:UTF-8
内容类型:text/xml
标题:{}
有效负载:soapenv:Envelope xmlns:soapenv=”http://schemas.xmlsoap.org/soap/envelope/"
soapenv:主体
请求:ResponseMsg
xmlns:req=”http://api-v1.gen.mm.vodafone.com/mminterface/request"![CDATA[?xml
version=“1.0”
encoding=“UTF-8”?响应
xmlns=”http://api-
v1.gen.mm.vodafone.com/mminterface/response“ResponseCode0/responseDeconversationDag_20170411_000059047aba809d6631/ConversationIDResponseDescService结果已成功处理。/responseDescoriginatorConversationVersationD902004_fhltd_60575.0/originatorConversationdServiceStatus/response]/req:ResponseMsg
/soapenv:主体
/soapenv:信封
--------------------------------------
客户端所需的xml:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <ResponseMsg xmlns="http://api-v1.gen.mm.vodafone.com/mminterface/result">
         <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
            <soapenv:Body>
               <req:ResponseMsg xmlns:req="http://api-v1.gen.mm.vodafone.com/mminterface/request"><![CDATA[<?xml version="1.0"encoding="UTF-8"?><response xmlns="http://api-v1.gen.mm.vodafone.com/mminterface/response"><ResponseCode>0</ResponseCode><ConversationID>AG_20170406_00004ddc3d70f6ba93f0</ConversationID><ResponseDesc>Service result processed successfully.</ResponseDesc><OriginatorConversationID>902004_fhltd_94802.0</OriginatorConversationID><ServiceStatus>0</ServiceStatus></response>]]></req:ResponseMsg>
            </soapenv:Body>
         </soapenv:Envelope>
      </ResponseMsg>
   </soap:Body>
</soap:Envelope>

0AG_20170406_00004DDC3D70F6BA93F0服务结果已成功处理。902004_fhltd_94802.00]>

注意:响应不应包含
<
>
。可能我应该在
apachecxf services.xml
文件中添加一些配置,或者创建一个拦截器来更改此行为。提前感谢您的时间和努力。

我在这里回答我自己的问题。解决方案是创建一个拦截器,强制cxf中的jaxb在CDATA中对响应字符串进行编码。因此,我从即时响应中删除了CDATA(现在应该由拦截器处理),结果响应应该如下所示:

String response = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\">"
            + "<soapenv:Body>"
            + "<req:ResponseMsg"
            + " xmlns:req=\"http://api-v1.gen.mm.vodafone.com/mminterface/request\"><?xml"
            + " version=\"1.0\""
            + "encoding=\"UTF-8\"?><response"
            + " xmlns=\"http://api-"
            + "v1.gen.mm.vodafone.com/mminterface/response\">"
            + "<ResponseCode>"+processedResultMsg.get("ResultCode")+"</ResponseCode>"
            + "<ConversationID>"+processedResultMsg.get("ConversationID")+"</ConversationID>"
            + "<ResponseDesc>Service result processed successfully.</ResponseDesc>"
            + "<OriginatorConversationID>"+processedResultMsg.get("OriginatorConversationID")+"</OriginatorConversationID>"
            + "<ServiceStatus>0</ServiceStatus>"
            + "</response></req:ResponseMsg>"
            + "</soapenv:Body>"
            + "</soapenv:Envelope>";
其思想是,如果xml字符串在CDATA部分中发送,它将不会被cxf内部xml解析器解析,因此不会转义特殊字符。这对我有效,我希望对其他人也有效。详情如下:

import java.io.OutputStream;
import javax.xml.stream.XMLStreamWriter;
import org.apache.cxf.interceptor.AttachmentOutInterceptor;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.apache.cxf.staxutils.StaxUtils;


public class CdataWriterInterceptor extends AbstractPhaseInterceptor<Message> {

    public CdataWriterInterceptor() {
        super(Phase.PRE_STREAM);
        addAfter(AttachmentOutInterceptor.class.getName());
    }

    @Override
    public void handleMessage(Message message) {
        System.out.println("############# CdataWriterInterceptor Executed #######################");
        message.put("disable.outputstream.optimization", Boolean.TRUE);
        XMLStreamWriter writer
                = StaxUtils.createXMLStreamWriter(message.getContent(OutputStream.class));
        message.setContent(XMLStreamWriter.class, new CDataXMLStreamWriter(writer));
    }
}
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;
import org.apache.cxf.staxutils.DelegatingXMLStreamWriter;

public class CDataXMLStreamWriter extends DelegatingXMLStreamWriter {

    private String currentElementName;

    public CDataXMLStreamWriter(XMLStreamWriter del) {
        super(del);
    }

    @Override
    public void writeCharacters(String text) throws XMLStreamException {
            System.out.println("WritingCData" + text);
            super.writeCData(text);
    }

    private boolean checkIfCDATAneededForCurrentElement() {
        if ("MessageBody".equals(currentElementName)) {
            return true;
        }
        return false;
    }

    @Override
    public void writeStartElement(String prefix, String local, String uri) throws XMLStreamException {
        currentElementName = local;
        super.writeStartElement(prefix, local, uri);
    }
}