我已经实现了一个 Java 8 本机 JAX-WS Web 服务,它将 xml 响应作为二进制 XML 返回。但是,不幸的是,客户端不支持 fastinfoset。是否有我可以使用的配置来关闭 fastinfoset,并使 Web 服务以纯 XML 格式返回响应,而不管客户端在 HTTP 请求标头中传递给 Web 服务的内容是什么?
1 回答
如JAX-WS RI/Metro 用户指南中所述,启用/禁用 FastInfoset 完全由客户端通过标准 Accept 和 Content-Type HTTP 标头驱动(假设 Web 服务支持 Fast Infoset)。当 Web 服务支持/启用 FastInfoset 时,这是标准行为。实际上,在 Metro 中,FastInfoset 恰好是默认启用的。因此,如果客户端不支持它,至少它不应该包含application/fastinfoset
在对 Web 服务的请求的 Accept 标头中。
如果要在 Metro Web 服务上完全关闭 FastInfoset 支持,可以使用Netbeans IDE 的 Web 服务“服务质量”配置 GUI。Netbeans 文档中对此有更多详细信息。您将在窗口底部看到一个标记为Disable Fast Infoset的复选框。应用它应该会导致在您的 WSDL 中添加一个新的 WS-Policy 断言,如下所示:
<fi:OptimizedFastInfosetSerialization enabled="false"/>
... 其中fi
是(Metro-specific)命名空间的前缀http://java.sun.com/xml/ns/wsit/2006/09/policy/fastinfoset/service
。这假定您使用了 WSDL 优先的方法。请注意,尽管 WS-Policy 是一个标准,但此断言不是,它仅供 Metro 堆栈使用。
一般来说,只要您想使用高级 JAX-WS Web 服务功能,例如消息优化(MTOM、Fast Infoset...)或 WS-* 标准(WS-Policy、WS-Security...),并且如果你买不起商业工具,我强烈建议你使用 Netbeans IDE 和 WSDL-first 方法,至少生成/修改 WSDL(特别是,如果没有像这样的适当工具,编辑 WS-Policy 断言非常费力)。实际上,Netbeans GUI 允许您发现比 Metro 用户指南中实际记录的功能更多的功能。如果您已经使用了另一个 IDE(如 Eclipse 或其他),您始终可以将生成的 WSDL 和相关文件复制到您的 Eclipse 项目中,并像往常一样在用户指南中应用适用于 Eclipse 的 JAX-WS RI/Metro 指南。特别是,您可能还需要在类路径中添加 Metro JAR,