我正在将 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 标签中(因为我需要在肥皂消息中发送 < 和 > 等字符)。然而,当 Web 服务稍后返回 XML 数据时,会发生奇怪的事情:
如果字符串足够长,WS 会将所有内容包装到 CDATA 中,这就是我想要的方式。
但是,如果字符串非常短(例如小型 XML 实例),则单个字符将被转义(例如 < 变为 <)。这不是我想要的,因为它使得处理数据变得非常困难。此外,如果我的字符串包含类似 &
的字符因为我存储了转义文本,所以它被杀死并变成 &
如何强制我的 Web 服务始终返回 CDATA 内的字符串,并且本身不转义任何内容?只需附加 <![CDATA[
和]]>
返回值之前的字符串之前和之后没有帮助,因为 CDATA 标记本身会被转义。
顺便说一句:我认为存储和检索 XML 的事实并不重要。如果我存储包含“<”、“>”和“&”等字符的常用字符串(这本质上就是我所做的),也会出现同样的问题。如果我通过 CDATA 存储它们,但不通过 CDATA 取回它们,但每个特殊字符都独立转义,我必须自己重建整个字符串。返回字符串时如何强制使用 CDATA?
最佳答案
虽然我同意@Henry的观点,认为它应该可以工作(特别是因为你的类型是 String),但如果你有一些特殊情况,你确实需要 CDATA 包装,无论如何:
我认为您必须创建一个 SOAPHandler(有很多资源可以实现这一点)。查找包含您的数据的元素。获取文本内容并将其 XML 解码回“正常”字符串。请参阅此处的“创建 CData 节节点”:http://www.w3schools.com/dom/dom_nodes_create.asp 。从元素中删除文本,创建 CData 节点并将其添加到您的内容中,这样应该可以正常工作。
理论上您也可以通过 JAXB ( How to generate CDATA block using JAXB? ) 执行此操作 - 刚刚找到该链接,尚未尝试。
关于java - JAX-WS : Return String as CDATA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20096272/