BeanDefinitionOverrideException

2023, Oct 15    

error log

java.lang.IllegalStateException: Failed to load ApplicationContext
Caused by: 
org.springframework.beans.factory.support.BeanDefinitionOverrideException: 
Invalid bean definition with name 'invalidMaxFileSizeException' 
defined in class path resource [spectra/attic/coreasset/depot/exception/rest/DepotExceptionConfig.class]: 
Cannot register bean definition [Root bean: class [null]; scope=; abstract=false; lazyInit=null; autowireMode=3; 
dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=depotExceptionConfig; 
factoryMethodName=invalidMaxFileSizeException; initMethodName=null; destroyMethodName=(inferred); 
defined in class path resource [spectra/attic/coreasset/depot/exception/rest/DepotExceptionConfig.class]] 
for bean 'invalidMaxFileSizeException': There is already [Root bean: class [null]; 
scope=; abstract=false; lazyInit=null; autowireMode=3; dependencyCheck=0; 
autowireCandidate=true; primary=false; factoryBeanName=fileExceptionConfig; f
actoryMethodName=invalidMaxFileSizeException; initMethodName=null; 
destroyMethodName=(inferred); 
defined in class path resource 
[spectra/attic/talk/messengerconnector/thirdparty/file/exception/rest/FileExceptionConfig.class]] bound.

cause

  • spring boot 시작하면서 빈을 등록할 때, 동일이름으로 여러 빈이 정의되어 있어서 발생하는 에러

problem

  • 발생 배경에는 제품 전반적으로 모듈 구조가 변경되면서 dependency관계도 재정의가 되었다. 그래서 기존에는 참조하고 있지 않았던 다른 어플리케이션의 Exception 모델이 빈으로 등록되면서 내부적으로 갖고 있던 동일 빈과 충돌이 발생하게 된 것이다.
@Bean
public ExceptionModel minFileSizeException() {
  return new ExceptionModel(MinFileSizeException.class, HttpStatus.BAD_REQUEST, FileRestErrorCode.INVALID_MIN_FILE_SIZE_ERROR);
}

solved

  • 1안) 빈 이름 변경
  • 2안) @Primary를 써서 우선순위를 설정하는 방법
  • 결국 1안으로 진행했다.

AnnotationBeanNameGenerator을 고려한다면?

  • 중복된 빈 이름을 막기 위해 AnnotationBeanNameGenerator을 사용할 수 있다.
  • 결론은 이 케이스는 @Bean으로 등록한 것이라 적용이 불가능하다.
  • @Bean으로 설정한 메소드는 @ComponentScan 및 AnnotationBeanNameGenerator와 함께 사용되는 것이 아니라 별도의 방식으로 사용되기 때문에 그러하다. 즉 스프링 컨테이너는 @Bean으로 등록된 구성 클래스는 스캔하지 않는다.