すきま風

勉強したことのメモとか

Spring Boot 2.2.1以降でWebClientを利用して巨大なResponseを受け取るとDataBufferLimitException が発生する

Spring Boot 2.2.1 (Spring 5.2.1) から、WebClientで256KBを超えるJsonを扱うと DataBufferLimitException が発生するようになりました。Spring 5.1.11 以降でも発生すると思います。 (こっちは自分で試していません)

issueはこちら になります。詳細は公式リファレンスを参照ください。 多分このcommitによるものだと思います。


対策として、application.ymlの設定でデフォルトのサイズを変更することができます。これが一番簡単でオススメ。

spring.codec.max-in-memory-size: 2MB

https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-application-properties.html


WebClient作成時に設定することもできます。

val webClient = WebClient.builder()
    .exchangeStrategies { builder ->
        builder.codecs {
            it.defaultCodecs().maxInMemorySize(2 * 1024 * 1024)
        }
    }
    .build()

公式リファレンスはこちら


また、Spring Boot 2.2.2 (Spring 5.2.2) では mutate methodを使って再設定することができます。commitはこちら

val webClient = WebClient.builder()
    .exchangeStrategies(
        ExchangeStrategies.withDefaults().mutate().codecs {
            it.defaultCodecs().maxInMemorySize(2 * 1024 * 1024)
        }
    )
    .build()

ただし、issueを読む限りcloneとmutateは現状の問題を解決するための一時的な処置で、future releaseではなくなる可能性があるため注意する必要がありそうです。(英語読解に多大な不安があるので間違っているかもしれません)


大抵の場合デフォルトで十分ですが、レガシーなAPIとかで巨大なJsonを返してくる場合はカスタマイズが必要になります。commitを見る限りProtocol Bufferなどでも同様にLimitがあるみたいなので注意が必要です。