Spring boot 如何在WebFilter上配置Spring数据缓冲区大小

Spring boot 如何在WebFilter上配置Spring数据缓冲区大小,spring-boot,gzip,spring-webflux,reactor-netty,Spring Boot,Gzip,Spring Webflux,Reactor Netty,我正在从客户端获取一个gzip内容,我需要在它到达控制器之前对它进行解压缩,否则我会得到一个jackson解析异常 我创建了一个WebFilter,它将请求打包并将正文映射到一个缩小的字节数组中,如下所示: @Override public Flux<DataBuffer> getBody() { return request.getBody().map(requestDataBuffer -> { try { GZI

我正在从客户端获取一个gzip内容,我需要在它到达控制器之前对它进行解压缩,否则我会得到一个jackson解析异常

我创建了一个WebFilter,它将请求打包并将正文映射到一个缩小的字节数组中,如下所示:

  @Override
    public Flux<DataBuffer> getBody() {
      return request.getBody().map(requestDataBuffer -> {
        try {
          GZIPInputStream gzipInputStream = new GZIPInputStream(requestDataBuffer.asInputStream());
          StringWriter writer = new StringWriter();
          IOUtils.copy(gzipInputStream, writer, UTF_8);
          byte[] targetArray = writer.toString().getBytes();
          return new DefaultDataBufferFactory().wrap(targetArray);
        }
        catch (IOException e) {
          LOG.error("failed to create gzip input stream. content-encoding is {}", request.getHeaders().getFirst(CONTENT_ENCODING));
          return requestDataBuffer;
        }
      });
    }
@覆盖
公共机构({
返回request.getBody().map(requestDataBuffer->{
试一试{
GZIPInputStream GZIPInputStream=新的GZIPInputStream(requestDataBuffer.asInputStream());
StringWriter编写器=新的StringWriter();
IOUtils.copy(gzip输入流,编写器,UTF_8);
字节[]targetArray=writer.toString().getBytes();
返回新的DefaultDataBufferFactory().wrap(targetArray);
}
捕获(IOE异常){
错误(“未能创建gzip输入流。内容编码为{}”,request.getHeaders().getFirst(content_encoding));
返回请求数据缓冲;
}
});
}
但是,当请求主体太大时,数据缓冲区并不包含所有数据,因此我会得到流异常


有没有关于如何配置数据缓冲区或如何接受gzip内容的想法?

我认为最好的方法是依靠Netty实现,并将服务器配置为使用Netty提供的支持

您可以创建一个组件(或直接从
@Bean
方法返回此组件的新实例),该组件自定义Reactor Netty服务器:

@Component
public class RequestInflateCustomizer implements NettyServerCustomizer {

    @Override
    public HttpServer apply(HttpServer httpServer) {
        return httpServer.tcpConfiguration(
                tcp -> tcp.doOnConnection(conn -> conn.addHandlerFirst(new HttpContentDecompressor())));
    }

}

你可以在这里看到类似的东西