webFlux框架webClient请求数据报错:Exceeded limit on max bytes to buffer : 262144

一、直接说原因:

因为接收响应数据的缓冲区不够大,限制为256k。(AbstractDataBufferDecoder类写死了限制)

二、网上解决办法:

1、配置文件增加配置(无效)

spring:
  codec:
    max-in-memory-size: 10240000

2、增加WebFluxWebConfig自定义类(无效)

@Configuration
@EnableWebFlux
public class WebFluxWebConfig implements WebFluxConfigurer {
    @Override
    public void configureHttpMessageCodecs(ServerCodecConfigurer configurer) {
        configurer.defaultCodecs().maxInMemorySize(2 * 1024 * 1024);
    }
}

3、本地项目中创建一个相同包路径的AbstractDataBufferDecoder类,将maxInMemorySize值调大(可用)

经过亲身实验,发现:

前两种不可用的原因是:WebClient并没有使用项目启动时基于配置创建的类,而是在WebClient.create的时候重新创建类,所以基于配置的方法没用。

第三种可用原因是:利用类的加载机制,优先加载项目中的类。

扫描二维码关注公众号,回复: 14917799 查看本文章

三、我的解决办法:

我总感觉以上方法不够优雅。决定自己研究解决方案。

研究源码,最终发现可以通过WebClient.build时可以修改maxInMemorySize值。

利用codecs方法。


        WebClient webClient =WebClient.builder()
                .baseUrl("http://192.168.0.149:8089")
                //修改maxInMemorySize的缓存值,默认是256k。修改为10MB
                .codecs(item->item.defaultCodecs().maxInMemorySize(10 * 1024 * 1024))
                .build();

        Mono<String> bodyToMono = webClient
                .post()
                .uri("/api/tr-run/")
                .header("content-type", "multipart/form-data; boundary=" + boundary)
                .body(BodyInserters.fromMultipartData(param))
                .retrieve()
                .bodyToMono(String.class);
        bodyToMono.subscribe(item->{
            //获取到请求结果,打印
            log.info(item.toString());
        });

问题解决

猜你喜欢

转载自blog.csdn.net/sumengnan/article/details/127332296