JAX-WS:将字符串作为CDATA返回

时间:2013-11-20 12:41:12

标签: java string web-services cdata

我正在使用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本身会被转义。

BTW:我认为我存储和检索XML的事实并不重要。如果我存储包含'&lt;','&gt;'等字符的常用字符串,则会出现同样的问题。和'&amp;' (这基本上就是我所做的)。如果我通过CDATA存储它们但不通过CDATA将它们取回但是每个特殊字符都是独立转义的,我必须自己重建整个字符串。如何在返回字符串时强制使用CDATA?

1 个答案:

答案 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?)这样做 - 刚找到链接,没试过。