2016-06-20 95 views
8

我在做一個WSDL客戶端,並想知道如何將XML元素設置爲CDATA。WSDL客戶端中的CDATA元素

我使用wsimport來生成源代碼,而CDATA元素是請求XML的一部分。 這是XML類的要求:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "", propOrder = { "dataRequest" }) 
@XmlRootElement(name = "ProcessTransaction") 
public class ProcessTransaction { 

    protected String dataRequest; 

    public String getDataRequest() { 
     return dataRequest; 
    } 

    public void setDataRequest(String value) { 
     this.dataRequest = value; 
    } 
} 

我已經試過@XmlAdapter,但它的變化對輸出沒有什麼...

import javax.xml.bind.annotation.adapters.XmlAdapter; 

public class AdaptorCDATA extends XmlAdapter<String, String> { 

    @Override 
    public String marshal(String arg0) throws Exception { 
     return "<![CDATA[" + arg0 + "]]>"; 
    } 

    @Override 
    public String unmarshal(String arg0) throws Exception { 
     return arg0; 
    } 
} 

在XML類:

@XmlJavaTypeAdapter(value=AdaptorCDATA.class) 
protected String dataRequest; 

我試圖調試,但它從來沒有踩到AdaptorCDATA函數。

wsimport版本是2.2.9jaxb-api版本是2.1

+0

爲什麼你需要這個?因爲你想寫xml-data到元素?這應該是開箱即用的。我們有一個xml數據字符串,在相應的元素中將其設置爲值,然後JAXB的魔術在編組時將所有的CDATA包裹起來。 – Frank

+0

我需要這個,因爲當我設置「dataRequest」與CDATA字符串,它完全逃脫。 – fabriciols

+0

好吧,我只是用我們的一個類的任意字符串成員嘗試了你的AdaptorCDATA,它很好地進入了'marshall()' - 方法。看看你的問題,我發現你有一個代碼片段,你有'@ XmlJavaTypeAdapter'-Annotation,但不是'ProcessTransaction'類中它應該是的。如果你有它,但是斷點仍然沒有被擊中,也許你必須在引發客戶之前重建和刷新? – Frank

回答

1

因此,如@user1516873建議,我將代碼移動到cxf,並用此,運行良好。現在我使用「wsdl2java」生成代碼,以及來自我的項目的cxf中的jar。

中有什麼不同代碼:

CdataInterceptor

import javax.xml.stream.XMLStreamWriter; 

import org.apache.cxf.message.Message; 
import org.apache.cxf.phase.AbstractPhaseInterceptor; 
import org.apache.cxf.phase.Phase; 

public class CdataInterceptor extends AbstractPhaseInterceptor<Message> { 

    public CdataInterceptor() { 
     super(Phase.MARSHAL); 
    } 

    public void handleMessage(Message message) { 
     message.put("disable.outputstream.optimization", Boolean.TRUE); 
     XMLStreamWriter writer = (XMLStreamWriter) message.getContent(XMLStreamWriter.class); 
     if (writer != null && !(writer instanceof CDataContentWriter)) { 
      message.setContent(XMLStreamWriter.class, new CDataContentWriter(writer)); 
     } 
    } 

    public void handleFault(Message messageParam) { 
     System.out.println(messageParam); 
    } 
} 

CDataContentWriter

import javax.xml.stream.XMLStreamException; 
import javax.xml.stream.XMLStreamWriter; 

import org.apache.cxf.staxutils.DelegatingXMLStreamWriter; 

public class CDataContentWriter extends DelegatingXMLStreamWriter { 

    public CDataContentWriter(XMLStreamWriter writer) { 
     super(writer); 
    } 

    public void writeCharacters(String text) throws XMLStreamException { 
     boolean useCData = text.contains("RequestGeneric"); 
     if (useCData) { 
      super.writeCData(text); 
     } else { 
      super.writeCharacters(text); 
     } 
    } 

    // optional 
    public void writeStartElement(String prefix, String local, String uri) throws XMLStreamException { 
     super.writeStartElement(prefix, local, uri); 
    } 
} 

使用作家和攔截:

MyService wcf = new MyService(url, qName); 
IMyService a = wcf.getBasicHttpBinding(); 

Client cxfClient = ClientProxy.getClient(a); 
CdataInterceptor myInterceptor = new CdataInterceptor(); 
cxfClient.getInInterceptors().add(myInterceptor); 
cxfClient.getOutInterceptors().add(myInterceptor); 

而且它很完美!