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 ResourceBundle读取properties文件方式

    java ResourceBundle读取properties文件方式

    这篇文章主要介绍了java ResourceBundle读取properties文件方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • Mybatis中的@Param及动态SQL详解

    Mybatis中的@Param及动态SQL详解

    这篇文章主要介绍了Mybatis中的@Param及动态SQL详解,@Param是MyBatis所提供的作为Dao层的注解,作用是用于传递参数,从而可以与SQL中的的字段名相对应,需要的朋友可以参考下
    2023-10-10
  • 详解MyBatis的动态SQL实现原理

    详解MyBatis的动态SQL实现原理

    MyBatis提供了强大的动态SQL语句生成功能,以应对复杂的业务场景,本篇文章将结合MyBatis解析SQL语句的过程对MyBatis中对<if>,<where>,<foreach>等动态SQL标签的支持进行分析,需要的朋友可以参考下
    2023-07-07
  • Jackson多态序列化图文详解

    Jackson多态序列化图文详解

    jackson允许配置多态类型处理,当进行反序列话时,JSON数据匹配的对象可能有多个子类型,为了正确的读取对象的类型,我们需要添加一些类型信息,下面这篇文章主要给大家介绍了关于Jackson多态序列化的相关资料,需要的朋友可以参考下
    2022-06-06
  • 为什么wait和notify必须放在synchronized中使用

    为什么wait和notify必须放在synchronized中使用

    这篇文章主要介绍了为什么wait和notify必须放在synchronized中使用,文章围绕主题的相关问题展开详细介绍,具有一定的参考价值,需要的小伙伴可以参考以参考一下
    2022-05-05
  • 面试必时必问的JVM 类加载机制详解

    面试必时必问的JVM 类加载机制详解

    这篇文章主要介绍了一文读懂Jvm类加载机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2021-08-08
  • java正则替换括号中的逗号实现示例

    java正则替换括号中的逗号实现示例

    本文主要介绍了java正则替换括号中的逗号实现示例,主要介绍了两种示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-01-01
  • Java中ArrayList的removeAll方法详解

    Java中ArrayList的removeAll方法详解

    这篇文章主要给大家介绍了关于Java中ArrayList的removeAll方法的相关资料,文中通过示例代码介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面跟着小编一起来看看吧。
    2017-07-07
  • 反射获取java对象的几种方式

    反射获取java对象的几种方式

    本文详细介绍了如何通过反射在Java中获取Class对象,使用不同构造器创建对象,以及Spring框架中的对象获取方法,包括构造器配置和setter注入,下面就来详细的介绍一下,感兴趣的可以了解一下
    2026-05-05
  • java基本教程之java线程等待与java唤醒线程 java多线程教程

    java基本教程之java线程等待与java唤醒线程 java多线程教程

    这篇文章主要介绍了对线程等待/唤醒方法,文中使用了多个示例,大家参考使用吧
    2014-01-01

最新评论