2012-01-03 1 views
1
ApplicationContext ctx = new AnnotationConfigApplicationContext(Config.class); 

AsyncBean session = ctx.getBean(AsyncBean.class); 

Caused by: java.lang.ClassCastException: $Proxy14 cannot be cast to AsyncBean 

가 @EnableAsync와 @Async을 사용하는 방법을 알아낼 수 없습니다 비동기 콩을 가져올 수 없습니다 .... 프록시를 가져 오는 것 같습니다 나는 싱글에 대한 핸들을 얻을 수 없습니다.봄 비동기가 -

또 다른 예 :

java.lang.ClassCastException가 : :이 또한 같은 클래스 캐스트 예외가 발생

@Bean 
public Bean bean(){ 
    Bean bean=new Bean(); 
    bean.registerHandler(asyncBean()); 
} 

@Bean 
public AsyncBean asyncBean(){ 
    return new AsyncBean(); 
} 

...에 의한 $ Proxy14는 AsyncBean 캐스팅 할 수없는

답변

1

Spring에서는 AsyncBean이 클래스가 아닌 인터페이스가되어야합니다. 일반적으로 프록시 된 클래스는 인터페이스 여야합니다.

0

AsyncBean은 인터페이스를 구현합니까? 그래서 기본 스프링에 의해 당신이 bean.For 예에 의해 구현 된 인터페이스 중 하나를 사용해야 할 상황에서 빈을 조회하는 인터페이스를 기반으로 JDK proxies.In 순서를 생성하는 경우

public class AsyncBean implements CertainInterface{ 
} 

당신은 CertainInterface의 C로 액세스 할 수 있습니다 = ctx.getBean (CertainInterface.class);

AsyncBean이 인터페이스를 구현하지 않으면 Spring은 CGLIB 클래스 기반 프록시를 사용합니다. 그렇다면 코드가 작동합니다.

당신이 AsyncBean 여전히 인터페이스를 구현하려면하지만 어떻게 당신이 봄을 지시 할 수 클래스 기반의 프록시를 사용하도록 희망은 그렇게 @EnableAsync (지정된 proxyTargetClass = TRUE)

를 사용