我正在使用JAX-WS和JAX-WS参考实现。我正在创建一个Web服务,它将XML存储起来,以后可以返回以前存储的XML。
@WebMethod(operationName="store")
public void store(@WebParam(name="XML") String XML)
{
...
}
@WebMethod(operationName="retrieve")
public String retrieve()
{
String s = XML;
return s;
}
我的界面使用XML的类型String。当我发送XML数据时,我将整个字符串包装成CDATA-Tag(因为我需要在soap消息中发送像<和>这样的字符)。但是,当Web Service稍后返回该XML数据时,会发生奇怪的事情:
如果字符串足够长,那么WS会将所有内容包装到CDATA中,这就是我想要的方式。
但是,如果字符串非常短(例如小的XML实例),则单个字符被转义(例如<变为< lt;)。这不是我想要的,因为它使得处理数据变得非常困难。此外,如果我的字符串包含&
之类的字符,因为我存储了转义文本,这会被杀死并变为&
如何强制我的Web服务始终在CDATA中返回字符串而不是单独转义任何内容?只需在返回值之前在字符串之前和之后附加<![CDATA[
和]]>
就无济于事,因为CDATA-Markup本身会被转义。
答案 0 :(得分:1)
虽然我同意@Henry它应该可以工作(特别是因为你的类型是字符串),如果你有一些特殊情况,你真的需要CDATA包装,无论如何:
我认为你必须创建一个SOAPHandler(这样做有很多资源)。找到包含数据的元素。获取文本内容和XML解码,将其恢复为“普通”字符串。请在此处查看“创建CData节节点”:http://www.w3schools.com/dom/dom_nodes_create.asp。从元素中删除文本,使用您的内容创建和添加CData节点,这应该可以正常工作。
理论上你也可以通过JAXB(How to generate CDATA block using JAXB?)这样做 - 刚找到链接,没试过。