[SPRING] Spring은이 종속성에 대한 autowire 후보가 될 수있는 적어도 하나의 bean을 예상했다.
SPRINGSpring은이 종속성에 대한 autowire 후보가 될 수있는 적어도 하나의 bean을 예상했다.
이 Autowire에 문제가 있습니다.
@Controller
public class ChiusuraController {
@Autowired
private ChiusuraProvider chiusuraProvider;
}
이 콩과 함께 :
@Service @Transactional
public class ChiusuraProvider extends ThreadProvider {
public void run() {}
}
확장
public abstract class ThreadProvider extends Thread implements InitializingBean, Runnable, DisposableBean {
...
}
이 오류가 발생합니다.
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'chiusuraController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.cinebot.service.ChiusuraProvider com.cinebot.web.controller.ChiusuraController.chiusuraProvider; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [com.cinebot.service.ChiusuraProvider] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
autowired 클래스의 ThreadProvider를 제거하면이 오류가 발생하지 않는다는 것을 알았지 만 실제로 ThreadProvider 추상 클래스가 필요합니다.
해결법
-
==============================
1.ThreadProvider 계층 구조의 어느 곳에서나 인터페이스가 있다면 인터페이스의 이름을 서비스 제공자의 유형으로 넣으십시오. 이 구조를 말하면 :
ThreadProvider 계층 구조의 어느 곳에서나 인터페이스가 있다면 인터페이스의 이름을 서비스 제공자의 유형으로 넣으십시오. 이 구조를 말하면 :
public class ThreadProvider implements CustomInterface{ ... }
그런 다음 컨트롤러에서 다음을 시도하십시오.
@Controller public class ChiusuraController { @Autowired private CustomInterface chiusuraProvider; }
이것이 일어나고있는 이유는 처음에 ChiusuraProvider가 ThreadProvider를 확장하지 못했을 때입니다. Spring은 (@Transaction을 처리하기 위해) CGLIB 기반 프록시를 만드는 기본이 될 것입니다.
당신이 ThreadProvider가 ThreadProvider가 어떤 인터페이스를 확장한다고 가정하고 ThreadProvider에서 확장했을 때, Spring은 ChisuraProvider 유형이 아닌 그 인터페이스의 구현 인 것으로 보이는 Java Dynamic Proxy 기반의 Proxy를 생성합니다.
ChisuraProvider를 절대적으로 사용해야한다면 ThreadProvider를 사용하여 다음과 같이 CGLIB 기반 프록시를 대체하거나 강제로 AspectJ를 사용할 수있다.
<aop:aspectj-autoproxy proxy-target-class="true"/>
다음은 Spring Reference 사이트에서 좀 더 많은 참고 자료입니다 : http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/classic-aop-spring.html#classic-aop -pfb
-
==============================
2.이 줄을 응용 프로그램 컨텍스트에 넣어야합니다.
이 줄을 응용 프로그램 컨텍스트에 넣어야합니다.
<context:component-scan base-package="com.cinebot.service" />
문서에서 클래스 자동 검색 및 Bean 정의 등록에 대해 자세히 알아보십시오.
from https://stackoverflow.com/questions/11332289/spring-expected-at-least-1-bean-which-qualifies-as-autowire-candidate-for-this-d by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring MVC 요청없이 WEB-INF하에 파일 가져 오기 (0) | 2019.03.05 |
---|---|
[SPRING] Spring 애플리케이션을위한 jboss-deployment-structure.xml이 필요한 이유는 무엇입니까? (0) | 2019.03.05 |
[SPRING] 봄 보안 LDAP 및 기억하기 (0) | 2019.03.05 |
[SPRING] 스프링 CrudRepository 예외 (0) | 2019.03.05 |
[SPRING] 두 개의 MVC 구성으로 봄 부팅 (0) | 2019.03.05 |