작성
·
294
·
수정됨
0
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.
1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? 예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예
[질문 내용]
여기에 질문 내용을 남겨주세요.
출력은 나오는 것 같은데 다음과 같은 오류가 발생합니다.
policyMap = {fixDiscountPolicy=hello.core.discount.FixDiscountPolicy@6995bf68, rateDiscountPolicy=hello.core.discount.RateDiscountPolicy@5143c662}
policies = [hello.core.discount.FixDiscountPolicy@6995bf68, hello.core.discount.RateDiscountPolicy@5143c662]
20:43:46.722 [main] WARN org.springframework.context.annotation.AnnotationConfigApplicationContext -- Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'orderServiceImpl' defined in file [C:\spring project\core\core\out\production\classes\hello\core\order\OrderServiceImpl.class]: Unsatisfied dependency expressed through constructor parameter 1: No qualifying bean of type 'hello.core.discount.DiscountPolicy' available: expected single matching bean but found 2: fixDiscountPolicy,rateDiscountPolicy
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'orderServiceImpl' defined in file [C:\spring project\core\core\out\production\classes\hello\core\order\OrderServiceImpl.class]: Unsatisfied dependency expressed through constructor parameter 1: No qualifying bean of type 'hello.core.discount.DiscountPolicy' available: expected single matching bean but found 2: fixDiscountPolicy,rateDiscountPolicy
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:798)
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:237)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1355)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1192)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:562)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:325)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:323)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:975)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:959)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:624)
at org.springframework.context.annotation.AnnotationConfigApplicationContext.<init>(AnnotationConfigApplicationContext.java:93)
at hello.core.Autowired.allbean.AllBeanTest.findAllBean(AllBeanTest.java:17)
at java.base/java.lang.reflect.Method.invoke(Method.java:578)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'hello.core.discount.DiscountPolicy' available: expected single matching bean but found 2: fixDiscountPolicy,rateDiscountPolicy
at org.springframework.beans.factory.config.DependencyDescriptor.resolveNotUnique(DependencyDescriptor.java:218)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1420)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1353)
at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:907)
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:785)
답변 3
1
안녕하세요, 인프런 AI 인턴입니다. bolkv1101님.
오류 메시지에 따르면, OrderServiceImpl
의 생성자가 DiscountPolicy
타입의 빈을 주입받기를 기대하는데, fixDiscountPolicy
와 rateDiscountPolicy
라는 두 개의 빈이 발견되어 스프링이 어떤 것을 주입해야 할지 결정할 수 없다는 내용입니다. 이것은 NoUniqueBeanDefinitionException
오류로 알려져 있으며, 동일한 타입의 여러 빈이 있을 때 발생합니다.
같은 문제에 관한 유사 질문들을 살펴봤을 때, 일반적으로 이 문제를 해결하기 위한 방법은 @Primary
, @Qualifier
, 또는 별도의 사용자 정의 애너테이션을 사용하여 스프링이 어떤 빈을 주입할지 명확하게 지시하는 것입니다.
다음은 유사한 문제로 질문하신 다른 수강생들에게 제공된 기존 답변 URL들입니다:
- 안녕하세요 선생님.. 오류가…ㅠㅠ
- 강의에서 @Qualifier
를 사용할 때 해당 애너테이션이 붙은 빈이 존재하지 않아서 발생하는 문제로 이해됩니다. 이 경우 @MainDiscountPolicy
애너테이션을 적절한 빈에 붙일 필요가 있습니다.
NoUniqueBeanDefinitionException
오류가 발생하는 경우, 스프링 부트 버전 문제일 수 있습니다.@Autowired 필드 명, @Qualifier, @Primary 강의중인데요
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
0
0
OrderServiceImpl에 @primary를 붙혔는데 돌아갑니다. 그런데 이러한 경우, 만약 어떤 사용자는 fixDiscountpolicy를, 다른 사용자는 rateDiscountPolicy를 적용하고 OrderServiceImpl에서 Order를 생성할 경우에는 어떻게 되나요?