3

当我是客户端并且我无法控制服务器或配置时,我需要强制 Apache CXF 发送 XML 请求并仅处理 XML 响应(我看到了这一点,但它仅适用于服务器)。现在它总是使用 FastInfoset,这对性能很有帮助,但会引起一些问题,我希望能够禁用它,但我没有在 Internet 上找到有关 FastInfoset 的太多信息以及应该如何禁用它。你有什么线索吗?

预先感谢您的任何帮助。

4

1 回答 1

2

这只有在远程服务器支持纯 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>
于 2018-01-30T11:40:29.943 回答