一、直接说原因:
因为接收响应数据的缓冲区不够大,限制为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());
});
问题解决