【发布时间】:2016-10-21 17:06:42
【问题描述】:
我正在做一个 WSDL 客户端,想知道如何将 XML 元素设置为 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.9,jaxb-api 版本是2.1。
【问题讨论】:
-
为什么需要这个?因为您想将 xml-data 写入元素?这应该是开箱即用的。我们有一个 xml-data 字符串,将其设置为相应元素中的值,然后 JAXB 的魔法在编组时将 CDATA 包装在四周。
-
我需要这个,因为当我使用 CDATA 字符串设置“dataRequest”时,它会被完全转义。
-
好的,我刚刚用我们的一个类的任意字符串成员尝试了你的 AdaptorCDATA,它很好地进入了
marshall()-方法。看着你的问题,我看到你有一个 sn-p,你有@XmlJavaTypeAdapter-Annotation 但不在应该在的ProcessTransaction-class 中。如果你有它但是断点仍然没有命中,也许你必须在启动客户端之前重建和刷新? -
你没有为 marshaller 设置
CharacterEscapeHandler,这就是你让所有 CDATA 转义的原因。检查stackoverflow.com/a/14197860/1516873 的其余部分并且AFAIK wsimport 不支持为客户端设置marshaller 属性。 CXF客户端支持cxf.apache.org/docs/jaxb.html
标签: java xml jaxb wsdl wsimport