[Spring] DataBufferLimitException: Exceeded limit on max bytes per JSON object: 262144
2020. 7. 23. 15:15
최근 아래와 같은 오류가 발생했다.
org.springframework.core.io.buffer.DataBufferLimitException: Exceeded limit on max bytes per JSON object: 262144
at org.springframework.http.codec.json.Jackson2Tokenizer.raiseLimitException(Jackson2Tokenizer.java:222)
Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException:
이전에 포스팅한
[Spring] DataBufferLimitException: Exceeded limit on max bytes to buffer : 262144 에러에 대한 해결 책
와 비슷하지만 또 다른 Component에서의 에러이다.
사용중인 Spring 버전
- Spring boot : 2.2.6.RELEASE
- Spring framework : 5.2.5.RELEASE
이전 오류와 차이?
이전 포스팅에 작성한 이슈는 Spring에서 외부 Api호출을 하기 위한 WebClient에서의 이슈였다. 그래서 WebClient를 build할때 maxInMemorySize 옵션에 대해서 -1 (unlimited) 또는 원하는 사이즈로 넣는 방식이었다. 위에 발생한 에러는 약간 다른 포인트이다. Spring이 Server로서 Request를 받을 때(Controller가 받을 때) 요청 Body데이터가 262144를 넘으면 발생한다.
해결
- Spring이 서버로 구동될때 설정되는 Codec들에 maxInMemorySize옵션을 조정해 줘야 한다.
- WebFlux를 사용할 때 아래와 같이 Codec을 customize하여 해결이 가능하다.
- WebFluxConfigurer를 implements하여 아래의 메소드에서 Codec을 Customizing한다.
@Configuration
public class WebFluxConfig implements WebFluxConfigurer {
@Override
public void configureHttpMessageCodecs(ServerCodecConfigurer configurer) {
configurer.defaultCodecs().maxInMemorySize(-1);
}
@Bean
public CodecCustomizer maxInMemorySizeCodecCustomizer() {
return (configurer) -> configurer.defaultCodecs().maxInMemorySize(-1);
}
}
두 함수의 차이점
- public void configureHttpMessageCodecs
- 이 함수는 Spring의 Controller가 HTTP Request를 받을 때 Body를 해석하는 Codec을 Customizing하는 방식이다.
- 일반적인 경우 이 함수만으로도 해결 가능.
- public CodecCustomizer maxInMemorySizeCodecCustomizer
- 이 함수는 Spring에서 Initialize되는 모든 Server/Client Codec에 대해 Customizer를 선언 하는 방식이다.
- 이 방식은 위
configureHttpMessageCodecs
방식보다 좀더 넓은 범위의 Codec에 대해서 Customize를 할 수 있다. - 예를 들어서 spring-cloud-gateway의 ProxyExchange같은 객체를 사용할 때, ProxyExchange는 내부적으로 WebClient를 가지고 있는데 그 Client는 일반적인 방법으로 Customizing이 불가능 하다.
- CodecCostomizer를 선언 해 놓으면 spring-cloud-gateway의 Component가 Initialize될 때 Customizer를 활용하도록 되어 있으므로 내부의 WebClient를 Customize할수 있다.
끗
'프로그래밍 > spring' 카테고리의 다른 글
[Spring] DataBufferLimitException: Exceeded limit on max bytes to buffer : 262144 에러에 대한 해결 책 (0) | 2020.05.03 |
---|---|
[Spring] RequestMapping에 path variable에 wildcard 적용하기 (0) | 2020.02.14 |
Profile의 활용 - 서로다른 데이터 소스에 대한 Profile 활용 (0) | 2020.02.06 |
Profile의 활용 - Gradle, Maven Build Profile과 Spring Profile (2) | 2019.12.27 |
Spring Boot 란? (0) | 2016.05.15 |