坑#Spring Cloud Gateway#DataBufferLimitException
现象
POST请求数据量大(Content-Length: 305000+)的时候Gateway报错, 报错栈如下:
org.springframework.core.io.buffer.DataBufferLimitException: Exceeded limit on max bytes to buffer : 262144at org.springframework.core.io.buffer.LimitedDataBufferList.raiseLimitException(LimitedDataBufferList.java:99)
尝试修改max-in-memory-size配置无效
原因
在Gateway配置文件routes节点中使用了CacheRequestBody
public class CacheRequestBodyGatewayFilterFactoryextends AbstractGatewayFilterFactory<CacheRequestBodyGatewayFilterFactory.Config> {private final List<HttpMessageReader<?>> messageReaders;public CacheRequestBodyGatewayFilterFactory() {super(CacheRequestBodyGatewayFilterFactory.Config.class);// 这块有问题this.messageReaders = HandlerStrategies.withDefaults().messageReaders();}
}

解决
方式一
参考: https://github.com/spring-cloud/spring-cloud-gateway/issues/1658
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.cloud.gateway.filter.factory.CacheRequestBodyGatewayFilterFactory;
import org.springframework.util.ReflectionUtils;
import java.lang.reflect.Field;@Bean
public BeanPostProcessor cacheRequestBodyGatewayFilterFactoryBeanPostProcessor() {return new BeanPostProcessor() {@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {if (bean instanceof CacheRequestBodyGatewayFilterFactory cacheFactoryBean) {// use java reflection to replace messageReaders in CacheRequestBodyGatewayFilterFactory// with message readers configured from CodecConfigurerField messageReadersField = ReflectionUtils.findField(CacheRequestBodyGatewayFilterFactory.class,"messageReaders");messageReadersField.setAccessible(true);ReflectionUtils.setField(messageReadersField, cacheFactoryBean, codecConfigurer.getReaders());messageReadersField.setAccessible(false);return cacheFactoryBean;}return bean;}};
}
方式二
参考: https://blog.csdn.net/fujiakai/article/details/134972127
重写org.springframework.core.codec.AbstractDataBufferDecoder类
- 在当前项目创建相同包名和类名文件
- 调整
maxInMemorySize默认值大小即可
