springboot出现DataBufferLimitException: Exceeded limit on max bytes to buffer:262144问题及解决

 更新时间:2026年04月28日 10:18:22   作者:我真的不吃辣条  
在Shenyu网关中,上传大文件时遇到`DataBufferLimitException`异常,问题在于Spring Boot 2版本中`max-in-memory-size`配置无效,通过创建同名类并修改`maxInMemorySize`值来解决问题,此方法利用Spring同名Bean覆盖机制,确保自定义类优先被加载

问题场景

spring boot 版本:2.2.2

应用网关:shenyu网关(soul网关)

错误描述

在一次项目中,我在上传文件时被网关拦截出现了这个问题:

DataBufferLimitException: Exceeded limit on max bytes to buffer :262144

发现只能上传256KB以下的文件,但现在文件随便就是10M或者更大。

具体错误如下:

org.springframework.core.io.buffer.DataBufferLimitException: Exceeded limit on max bytes to buffer : 262144
    at org.springframework.core.io.buffer.LimitedDataBufferList.raiseLimitException(LimitedDataBufferList.java:101)
    Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: 
Stack trace:
        at org.springframework.core.io.buffer.LimitedDataBufferList.raiseLimitException(LimitedDataBufferList.java:101)
        at org.springframework.core.io.buffer.LimitedDataBufferList.updateCount(LimitedDataBufferList.java:94)
        at 

解决方案

方案一(对我不生效)

一般来说直接设置  max-in-memory-size 就可以生效

spring:
  codec:
    max-in-memory-size: 100MB

但是以上代码在spring2.x.x版本中不生效,官方说解决了,估计是在后面版本解决了,但是项目都上生产了肯定不可能现在来换版本,所以只有另想办法,在他启动中debug发现在初始化代码时已经设置为262144了:

方案二(有效)

于是继续往上发现在 org.springframework.core.codec.AbstractDataBufferDecoder中进行初始化的,于是诞生了写一个同名类来给他初始化,利用Spring中同名Bean相互覆盖的特性,在我们注入了同名bean就会优先使用我们的类。

层级目录如下:

我们要保证这个类的包名和spring的名称一模一样,具体代码不变,只需修改maxInMemorySize 大小,如下所示:

package org.springframework.core.codec;

import java.util.Map;
import org.reactivestreams.Publisher;
import org.springframework.core.ResolvableType;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.core.io.buffer.DataBufferUtils;
import org.springframework.lang.Nullable;
import org.springframework.util.MimeType;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;


/**
 * @Auther: whhh
 * @Date: 2021/4/7 11:08
 * @Description:  图片上传重写缓存区大小,解决上传图片缓存不够问题
 */
public abstract class AbstractDataBufferDecoder<T> extends AbstractDecoder<T> {
    //图片上传重写缓存区大小,解决上传图片缓存不够问题
    private int maxInMemorySize = 1024*1024*100;

    protected AbstractDataBufferDecoder(MimeType... supportedMimeTypes) {
        super(supportedMimeTypes);
    }

    public void setMaxInMemorySize(int byteCount) {
        this.maxInMemorySize = byteCount;
    }

    public int getMaxInMemorySize() {
        return this.maxInMemorySize;
    }

    public Flux<T> decode(Publisher<DataBuffer> input, ResolvableType elementType, @Nullable MimeType mimeType, @Nullable Map<String, Object> hints) {
        return Flux.from(input).map((buffer) -> {
            return this.decodeDataBuffer(buffer, elementType, mimeType, hints);
        });
    }

    public Mono<T> decodeToMono(Publisher<DataBuffer> input, ResolvableType elementType, @Nullable MimeType mimeType, @Nullable Map<String, Object> hints) {
        return DataBufferUtils.join(input, this.maxInMemorySize).map((buffer) -> {
            return this.decodeDataBuffer(buffer, elementType, mimeType, hints);
        });
    }

    /** @deprecated */
    @Deprecated
    @Nullable
    protected T decodeDataBuffer(DataBuffer buffer, ResolvableType elementType, @Nullable MimeType mimeType, @Nullable Map<String, Object> hints) {
        return this.decode(buffer, elementType, mimeType, hints);
    }
}

重点就是这里,他会去读取这个配置:

到这里我们的问题就解决了,上传文件就成功了。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java配置沙箱支付的实现示例

    java配置沙箱支付的实现示例

    箱支付是支付平台提供的模拟支付环境,包含测试用的 APPID、密钥、网关、测试账号等资源,下面就来介绍一下如何实现,感兴趣的可以了解一下
    2025-08-08
  • Java中的封装性(包含this关键字,构造器等)

    Java中的封装性(包含this关键字,构造器等)

    这篇文章主要介绍了Java中的封装性(包含this关键字,构造器等)问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • 浅谈JavaAPI 中 <E> 与 <T> 的含义

    浅谈JavaAPI 中 <E> 与 <T> 的含义

    下面小编就为大家带来一篇浅谈JavaAPI 中 <E> 与 <T> 的含义。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • Java的Volatile实例用法及讲解

    Java的Volatile实例用法及讲解

    在本篇文章里小编给大家整理了关于Java的Volatile知识点相关内容,有需要的朋友们可以跟着学习下。
    2019-09-09
  • Java7和Java8中的ConcurrentHashMap原理解析

    Java7和Java8中的ConcurrentHashMap原理解析

    这篇文章主要介绍了Java7和Java8中的ConcurrentHashMap原理解析,对ConcurrentHashMap感兴趣的读者,一定要好好看一下
    2021-04-04
  • mybatis中延迟加载Lazy策略的方法

    mybatis中延迟加载Lazy策略的方法

    这篇文章主要介绍了mybatis中延迟加载Lazy策略,需要的朋友可以参考下
    2018-06-06
  • checkpoint 机制具体实现示例详解

    checkpoint 机制具体实现示例详解

    这篇文章主要为大家介绍了checkpoint 机制具体实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • Java开发中最让人头疼的十个bug

    Java开发中最让人头疼的十个bug

    这篇文章主要给大家总结介绍了关于Java开发中最让人头疼的十个bug,同样的bug信息,可能背后有千万种原因,而我,永远都不知道到底是哪一个,努力通过代码积累尽可能多的bug,并将它们进行分类,可以帮你debug节省了时间,需要的朋友可以参考下
    2021-10-10
  • 一问详解SpringBoot配置文件优先级

    一问详解SpringBoot配置文件优先级

    在SpringBoot项目当中,我们要想配置一个属性,可以通过这三种方式当中的任意一种来配置都可以,那么优先级怎么算,本文主要介绍了一问详解SpringBoot配置文件优先级,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • java md5工具类分享

    java md5工具类分享

    这篇文章主要介绍了java的md5工具类,需要的朋友可以参考下
    2014-02-02

最新评论