如何在 JAX-WS 中禁用 fastinfoset 并且总是 return XML 结果

How to Disable fastinfoset in JAX-WS and always return XML results

我已经实现了一个 Java 8 本机 JAX-WS 网络服务,它是 returning xml 二进制响应 XML。不过很遗憾客户端不支持fastinfoset。是否有我可以使用的配置关闭 fastinfoset,并使 web 服务 return 以普通 XML 响应,无论客户端在 HTTP 请求 header 中传递给 web 服务什么?

JAX-WS RI/Metro user guide 所述,enabling/disabling FastInfoset 完全由客户端通过标准 Accept 和 Content-Type HTTP headers 驱动(假设网络服务支持 Fast Infoset) .这是标准行为,当 FastInfoset 在 Web 服务上为 supported/enabled 时。实际上,FastInfoset 恰好在 Metro 中默认启用。所以如果客户端不支持,至少不应该在对webservice请求的Acceptheader中包含application/fastinfoset

如果您想完全关闭 Metro Web 服务上的 FastInfoset 支持,您可以使用 Web Service "Quality of Service" configuration GUI of Netbeans IDE. More details on this in Netbeans documentation。您会在 window 的底部看到一个标记为 禁用快速信息集 的复选框。应用它应该会导致在您的 WSDL 中添加一个新的 WS-Policy 断言,如下所示:

<fi:OptimizedFastInfosetSerialization enabled="false"/>

... 其中 fi 是 (Metro-specific) 命名空间 http://java.sun.com/xml/ns/wsit/2006/09/policy/fastinfoset/service 的前缀。这假设您使用了 WSDL-first 方法。请注意,虽然 WS-Policy 是标准,但此断言不是,它仅供 Metro 堆栈使用。

总的来说,只要您想使用高级 JAX-WS 网络服务功能,例如消息优化(MTOM、Fast Infoset...)或 WS-* 标准(WS-Policy, WS-Security...) 如果您买不起商业工具,我强烈建议您使用 Netbeans IDE 和 WSDL-first 方法,至少 generate/modify WSDL(特别是, 如果没有像这样的合适工具,编辑 WS-Policy 断言是相当费力的)。实际上,Netbeans GUI 允许您发现比 Metro 用户指南中实际记录的功能更多的功能。 如果您已经在使用另一个 IDE,如 Eclipse 或其他),您始终可以将生成的 WSDL 和相关文件复制到您的 Eclipse 项目,并在用户指南中应用 Eclipse 的 JAX-WS RI/Metro 指南照常。特别是,您可能还需要在类路径中添加 Metro JAR,因为本机 JDK 中未提供这些功能中的大部分。