6

我有一个 JAX-WS 端点,其中包含许多方法,这些方法都返回转换为字符串的 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>

在新服务器上,它返回为:

<?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>

几乎完全相同,但只有左尖括号被转义,而不是右括号。

我已经使用直接 HTTP POST 请求对此进行了测试,所以我知道它没有被任何客户端代码破坏。

我再次将服务器升级到 Glassfish 3.1,认为包含的 Web 服务库有问题,但没有运气。我的应用程序完全依赖 glassfish 中的 web 服务支持——它不包含任何自己的 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();
  }
}

我找不到其他人遇到这个问题,除了这张海报的参考,他将其视为服务的消费者:我可以强制 JAXB 不要将“转换为”,例如,当编组为 XML 时?

这是一个已发布的服务,所以我不能依赖消费者能够更新他们的客户来处理这个问题。有趣的是,我使用生成的 Java 客户端的现有测试接口似乎并没有受到它的困扰,但我不能依赖它。

有没有人遇到过这个并能够解决它?有没有办法可以连接到 WS 框架并自己转义作为解决方法?

提前致谢。

4

1 回答 1

4

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

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

它指出右尖括号 (>) 可以转义但不一定要转义,所以你应该没问题。

于 2011-03-07T20:53:32.260 回答