【问题标题】:CXF Enabling GZIP failed at the WSDL loading加载 WSDL 时,CXF 启用 GZIP 失败
【发布时间】:2022-02-02 12:08:01
【问题描述】:

我目前在尝试为 CXF 启用 GZIP 压缩时遇到一个问题:WSDL 加载失败,因为它已被压缩并且客户端部分没有解压缩它。

这意味着比我执行以下操作时:

persistenceService = Service.create(
                                new URL(replaceHostAndPort(
                                        getClientServiceConfiguration().getWsMetadataPersistenceService())),
                                new QName("http://metadata.ws.com", "WsMetadataPersistenceService"), gzipFeature);
                        mDefaultMetadataPersistence = persistenceService.getPort(IWsMetadataPersistence.class);

Service.create() 上的代码失败,因此与配置 ClientProxy 无关。

据我在 CFX 的源代码中所知,WSDL 的加载没有使用我在参数中传递的功能,也没有使用我使用以下配置在默认总线上传递的功能:

<bean id="compressGZIPFeature" class="org.apache.cxf.transport.common.gzip.GZIPFeature"/> 
<cxf:bus>
    <cxf:features>
         <ref bean="compressGZIPFeature"/>        
    </cxf:features>
</cxf:bus> 

注意:我可以在使用 bus 元素的 CXF 内部类使用的总线实例中看到,我的功能在那里并且已正确初始化(添加输入/输出拦截器),但是我在尝试时从不传递它们加载 WSDL 文件。

现在我有点卡住了:WSDL 一开始就不应该被压缩吗?那是怎么回事,还是我的问题出在客户端?

在服务器端,我尝试了各种我能找到的组合,希望只压缩请求的内容而不是 WSDL,但无济于事:

  • @GZIP
  • XML 总线配置
  • @In/OutInterceptors

按照我对 CXF 客户端代码的理解,来自 HttpUrlConnection 的 InputStream 直接交给 XMLReader 以读取 WSDL,而不使用拦截器(此外,GZIPInterceptor 忽略来自 GET 请求的消息,因此它应该忽略GET [...]?wsdl aniway。如果您想检查代码,请参阅 WSDLManagerImpl.loadDefinition()。

我不确定它是否相关,我正在采用 openjdk 8 和 cxf 3.1.7。

【问题讨论】:

    标签: java web-services soap wsdl cxf


    【解决方案1】:

    我找到了解决方案:我在 HTTP Conduit 上添加了压缩,这甚至会发出 GZIP 版本的 wsdl 请求请求。问题是 WSDL 阅读器不处理接收到的 GZIP 流。

    所以我不得不删除客户端的压缩配置,并使用以下代码确保只有 SOAP 请求会被压缩:

    public <T> T createAndConfigureService(Class<? extends T> theServiceClass, Service service){
        T theWebService = service.getPort(theServiceClass);
        Map<String, Object> requestHeaders = new HashMap<>();
        requestHeaders.put("Accept-Encoding", new ArrayList<>(Arrays.asList("gzip")));
        ((BindingProvider)theWebService).getRequestContext().put(MessageContext.HTTP_REQUEST_HEADERS, requestHeaders);
        Client client = ClientProxy.getClient(theWebService); 
        client.getInInterceptors().add(new GZIPInInterceptor());
        return theWebService;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-02
      相关资源
      最近更新 更多