2017-12-28 56 views
1

autowired 속성 SaveProcessor가있는 SaveRoute 클래스가 있습니다. 이 SaveProcessor 클래스에는 @Transactional 주석으로 주석 처리 된 메소드가 있습니다. 내 응용 프로그램을 실행하려고하면 Bean SaveProcessor 종속성 삽입이 실패했다는 Java 예외가 발생합니다. SaveProcess 클래스 메소드에서 @Transactional 어노테이션을 제거하면 정상적으로 작동합니다. 그런 종류의 autowiring에 때Spring @Transactional annotation을 사용하여 클래스를 Autowire로 만들 수 없습니다.

public class SaveRoute implements RouteBuilder{ @Autowired private SaveProcessor saveProcessor; }

public class SaveProcessor implements Processor{ 

@Override 
public void Process(Exchange exchange){ 
    this.save(); 
} 
@Transactional 
public void Save(){ 

}} 

It would be great if someone could help me on this. @Transactional making SaveProcessor class not a candidate for autowiring. 
+1

가능한 복제가 beacause를 귀하의 경우

@Autowired private Processor saveProcessor; 

는 일이 될 것입니다 (HTTPS [어떻게 트랜잭션 클래스에 autowire하기하기를?] : // 유래.com/questions/33240700/how-to-autowire-on-transaction-class) – tsolakp

+0

더 많은 컨텍스트를 제공해야합니다. 어떻게 Spring AOP를 활성화하고 있습니까? Boot를 사용하고 있습니까? 빌드 종속성은 어떻게 생깁니 까? – chrylis

+0

@ tsolakp의 복제본은 문제를 명확하게 설명하지만 날짜가 있기 때문에 아직이 문제를 다루지는 않습니다. – chrylis

답변

-1

당신은 Processor 인터페이스 대신 SaveProcessor 구체적인 클래스를 사용해야합니다 :

@Autowired 
private Processor saveProcessor; 
+0

그게 유일한 해결책은 아닙니다. CGLIB를 사용할 수도 있습니다. – tsolakp

+0

프로세서 인터페이스가 내 응용 프로그램에서 다른 구현을 가지고 있으므로 프로세서 인터페이스를 사용할 수 없습니다. –

+0

보다 @ @ 한정자 주석이 도움이 될 것입니다. – andrii

0

내가 해결책을 알아낼 수 있었다. 내 SaveProcessor 클래스의 상단에 추가

@Scope (프록시 모드 = ScopedProxyMode.TARGET_CLASS)

내 문제를 해결.

나는

@Autowire 공공 프로세서 SaveProcessor을 사용할 수 없습니다;

내 응용 프로그램에서 Processor에 대한 다중 파일 구현이 있기 때문입니다.

+0

여러 구현을 사용하고 있다면'@ Qualifire'를 사용할 수 있습니다. 만약 당신이 autowiring을위한 인터페이스를 사용한다면 (인터페이스 기반의 프록시 사용) 클래스 기반의 autowiring을 사용한다면 클래스는 스프링 컴포넌트이어야한다. 즉, 클래스는'@ Component' 또는'@Service' 또는'@Repository'로 주석을 달아야합니다. –

0

은 당신이 당신의 SaveProcessor 개체의

@Transactional

스프링 메이크업 프록시, 때문에 설정할 때, 인터페이스 를 autowire하기 위해 좋은 방법입니다, Spring @Transactional annotation making my class not able to Autowire 대답 동의 그것은 프로세서 스프링은 DynamicProxy을 사용합니다 구현합니다. 그래서 당신이 맥락에서 클래스 SaveProcessor와 콩이 없어, 당신은 ... 느릅 나무가 intarface 프로세서을 구현 CALSS 프록시 $와 콩이있다.

이것이 스프링이 후보를 찾을 수없는 이유입니다. 당신이 프로세서, 하나 이상의 구현이있는 경우

는 그냥 beanName에 의해

@Qualifier

, 또는에서 autowiring을 사용하여 문제가되지 않습니다. 콩이의 이름 saveProcessor