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的时候重新创建类,所以基于配置的方法没用。

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

三、我的解决办法:

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

研究源码,最终发现可以通过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());
        });

问题解决

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值