【Java Spring Boot】JacksonのObjectMapperを異なる設定で2つ用意しようとすると、循環参照のエラーが出る

前提

  • Java 21
  • org.springframework.boot 3.2.2

該当のソースコード

以下のWebConfigを実装して起動すると循環参照のエラーが発生します。

java

1import com.fasterxml.jackson.databind.ObjectMapper;2import com.fasterxml.jackson.databind.SerializationFeature;3import org.springframework.beans.factory.annotation.Autowired;4import org.springframework.context.annotation.Bean;5import org.springframework.context.annotation.Configuration;6import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;7import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;8 9@Configuration10public class WebConfig implements WebMvcConfigurer {11 12 @Autowired13 private MappingJackson2HttpMessageConverter springMvcJacksonConverter;14 15 @Bean("objectMapper2")16 public ObjectMapper objectMapper2() {17 ObjectMapper objectMapperCopy = springMvcJacksonConverter.getObjectMapper().copy();18 objectMapperCopy.disable(SerializationFeature.INDENT_OUTPUT);19 return objectMapperCopy;20 }21 22}

発生している問題・エラーメッセージ

Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'objectMapper2': Requested bean is currently in creation: Is there an unresolvable circular reference? at app//org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.beforeSingletonCreation(DefaultSingletonBeanRegistry.java:355) at app//org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:227) at app//org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:323) at app//org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) at app//org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:254) at app//org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1443) at app//org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1353) at app//org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:907) at app//org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:785) ... 78 more

実現したいこと

異なる設定のObjectMapperを2つ用意したい。
2つ目のObjectMapperはSpringフレームワーク側で自動設定されたものをコピーして一部の設定だけ書き換えたい。

疑問点

MappingJackson2HttpMessageConverter のAutowiredを削除すると正常に起動するのですが、
なぜMappingJackson2HttpMessageConverter のAutowired と ObjectMapperのBeanを同時に記述すると循環参照になってしまうのかよくわかっていません。

コメントを投稿

0 コメント