当我是客户端并且我无法控制服务器或配置时,我需要强制 Apache CXF 发送 XML 请求并仅处理 XML 响应(我看到了这一点,但它仅适用于服务器)。现在它总是使用 FastInfoset,这对性能很有帮助,但会引起一些问题,我希望能够禁用它,但我没有在 Internet 上找到有关 FastInfoset 的太多信息以及应该如何禁用它。你有什么线索吗?
预先感谢您的任何帮助。
当我是客户端并且我无法控制服务器或配置时,我需要强制 Apache CXF 发送 XML 请求并仅处理 XML 响应(我看到了这一点,但它仅适用于服务器)。现在它总是使用 FastInfoset,这对性能很有帮助,但会引起一些问题,我希望能够禁用它,但我没有在 Internet 上找到有关 FastInfoset 的太多信息以及应该如何禁用它。你有什么线索吗?
预先感谢您的任何帮助。
这只有在远程服务器支持纯 XML 响应时才有可能。大多数同时支持 Fastinfoset 和纯 XML 的服务器都在查看Accept
请求的标头,以决定以哪种格式返回响应。因此,您可以尝试通过发送Accept: application/xml
每个请求的标头来强制 XML 响应。为此,您需要创建一个 CXF 输出拦截器并将其注册到您的应用程序中。
以下拦截器将始终设置Accept: application/xml
public class HttpHeaderInterceptor extends AbstractPhaseInterceptor<Message>{
public XmlOnlyInterceptor() {
super(Phase.POST_PROTOCOL);
}
@Override
public void handleMessage(Message message) throws Fault {
Map<String, List> headers = (Map<String, List>)message.get(Message.PROTOCOL_HEADERS);
headers.put("Accept", Collections.singletonList("application/xml"));
}
}
要注册它,请使用以下配置
<jaxws:client id="clientBean" serviceClass="org.example.service.ServicePortType"
address="example.org/src/service/ServicePort">
<jaxws:outInterceptors>
<bean class="org.example.interceptor.HttpHeaderInterceptor"/>
</jaxws:outInterceptors>
</jaxws:client>