JAX-WS端点仅部分转义XML String

Pat*_*era 6 java xml web-services escaping java-metro-framework

我有一个JAX-WS端点,其中包含许多方法,这些方法都返回转换为String的XML文档.

这已经在Sun Java System Application Server 9.1 Update 2上运行了一段时间,但需要部署到新服务器.

它被部署到Glassfish 3.0.1没有任何问题,除了一个小问题.原始响应示例摘录:

<?xml version="1.0" ?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
  <S:Body>
    <ns2:getTransactionTypesResponse xmlns:ns2="http://myns.com.au/">
      <return xmlns="">&lt;?xml version="1.0" encoding="UTF-8"?&gt;

&lt;my_xml version="1.2" query_date=""&gt;
  &lt;add_transaction_type description="Contributions" name="Contribution" type="C"/&gt;
  &lt;add_transaction_type description="Transfer In" name="Xfr or R/O In" type="X"/&gt;
&lt;/my_xml&gt;
      </return>
    </ns2:getTransactionTypesResponse>
  </S:Body>
</S:Envelope>
Run Code Online (Sandbox Code Playgroud)

在新服务器上,它返回:

<?xml version='1.0' encoding='UTF-8'?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
  <S:Body>
    <ns2:getTransactionTypesResponse xmlns:ns2="http://myns.com.au/">
      <return>&lt;?xml version="1.0" encoding="UTF-8"?>

&lt;myxml version="1.2" query_date="">
  &lt;add_transaction_type description="Contributions" name="Contribution" type="C"/>
  &lt;add_transaction_type description="Administration Fee" name="Fee:AUM" type="U"/>
&lt;/my_xml>
      </return>
    </ns2:getTransactionTypesResponse>
  </S:Body>
</S:Envelope>
Run Code Online (Sandbox Code Playgroud)

几乎完全相同但只有开口尖括号被转义,而不是关闭括号.

我已使用直接HTTP POST请求对此进行了测试,因此我知道它没有受到任何客户端代码的破坏.

我再次将服务器升级到Glassfish 3.1,认为包含的webservice库存在问题,但没有运气.我的应用程序完全依赖于glassfish中的webservice支持 - 它不包含任何自己的WS或XML库.

端点基本上定义如下:

@WebService
@SOAPBinding(style=SOAPBinding.Style.DOCUMENT, use=SOAPBinding.Use.LITERAL, parameterStyle=SOAPBinding.ParameterStyle.WRAPPED)
public class MyEndpoint {
  @WebMethod()
  public String getTransactionTypes() {
    return someMethodThatReturnsXmlString();
  }
}
Run Code Online (Sandbox Code Playgroud)

我一直无法找到这个问题的其他人,除了这个海报的参考,他已经将其视为服务的消费者:我可以强制JAXB不转换成"进入",例如,当编组到XML时?

这是一个已发布的服务,因此我不能依赖于消费者能够更新其客户端来处理此问题.有趣的是,我使用生成的Java客户端的现有测试界面似乎并没有受到它的困扰,但我不能依赖于此.

有没有人遇到这个并且能够解决它?有没有办法可以挂钩到WS框架并自行转义作为解决方法?

提前致谢.

bdo*_*han 4

来自http://www.w3.org/TR/xml/#syntax,第 2.4 节

与号字符 (&) 和左尖括号 (<) 不得以其文字形式出现,除非用作标记分隔符,或在注释、处理指令或 CDATA 部分中使用。如果其他地方需要它们,则必须分别使用数字字符引用或字符串“ & ”和“ < ”对其进行转义。右尖括号 (>) 可以使用字符串“ > ”表示,并且为了兼容性,当它出现在内容中的字符串“ ]]> ”中时,必须使用“ > ”或字符引用进行转义,当string 没有标记 CDATA 部分的结尾。

它指出右尖括号 (>) 可以被转义,但不是必须如此,所以应该没问题。