2016-06-20 61 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); 

而且它很完美!