2012-07-04 63 views
17

我有這個自動裝配麻煩:春季預計將有至少1 Bean上有資格作爲自動裝配候選人,這種依賴性

@Controller 
public class ChiusuraController { 

    @Autowired 
    private ChiusuraProvider chiusuraProvider; 
} 

與這個bean:

@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)} 

我看到,我沒有得到這個錯誤,如果我刪除擴展ThreadProvider的自動裝配類,但我真的需要ThreadProvider抽象類。

回答

19

如果ThreadProvider層次結構中的任何位置有接口,請嘗試將接口的名稱作爲服務提供者的類型,例如。如果你有說這種結構:

public class ThreadProvider implements CustomInterface{ 
... 
} 

然後在你的控制器試試這個:

@Controller 
public class ChiusuraController { 

    @Autowired 
    private CustomInterface chiusuraProvider; 
} 

爲什麼發生這種情況時,你的第一種情況下,當你沒有足夠的理由ChiusuraProvider延長ThreadProvider春天可能正在爲你創建一個基於CGLIB的代理(來處理@Transaction)。

當DID延伸自ThreadProvider,假設ThreadProvider擴展了某個接口,Spring在這種情況下創建一個基於Java動態代理的代理,該代理似乎是該接口的實現,而不是ChisuraProvider類型。

如果你絕對需要使用ChisuraProvider你可以嘗試的AspectJ作爲替代或強制基於CGLIB代理的情況下與ThreadProvider也這樣說:

<aop:aspectj-autoproxy proxy-target-class="true"/> 

這裏是從Spring參考一些這方面的更多的參考site:http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/classic-aop-spring.html#classic-aop-pfb

+0

如果我的類實現了多個接口,該怎麼辦? – user1050619

+0

等等......你只是救了我的命。我使用了註釋版本@EnableAspectJAutoProxy(proxyTargetClass = true)。謝謝! –

7

你應該把這個線在你的應用環境:

<context:component-scan base-package="com.cinebot.service" /> 

Read more about Automatically detecting classes and registering bean definitions in documentation

+0

我添加了這一行,其中ChiusuraProvider包含在包com.cinebot.service中,而ThreadProvider不包含在該包中......但它不起作用。 – Tobia

+0

您是否試過@ BijuKunjummen的答案(使用AOP作用域代理,記得添加CGLIB依賴)? – Xaerxess

相關問題