2012-07-04 8 views
17

I mają problemy z tym Autowire:Wiosna oczekuje przynajmniej jeden fasoli, które kwalifikuje się jako autowire kandydata do tej zależności

@Controller 
public class ChiusuraController { 

    @Autowired 
    private ChiusuraProvider chiusuraProvider; 
} 

ten Bean

@Service @Transactional 
public class ChiusuraProvider extends ThreadProvider { 


    public void run() {} 
} 

który rozciąga

public abstract class ThreadProvider extends Thread implements InitializingBean, Runnable, DisposableBean { 
... 
} 

Otrzymuję ten błąd:

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

Widziałem, że nie dostałem tego błędu, jeśli usunęło rozszerza ThreadProvider z klasy autowired, ale naprawdę potrzebuję klasy abstrakcyjnej ThreadProvider.

Odpowiedz

19

Jeśli w hierarchii ThreadProvider istnieje interfejs, spróbuj wpisać nazwę interfejsu jako typ dostawcy usług, np. jeśli trzeba powiedzieć to struktura:

public class ThreadProvider implements CustomInterface{ 
... 
} 

Następnie w kontrolerze spróbuj tego:

@Controller 
public class ChiusuraController { 

    @Autowired 
    private CustomInterface chiusuraProvider; 
} 

powód, dla którego tak się dzieje jest, w pierwszym przypadku, gdy nie masz ChiusuraProvider przedłużyć ThreadProvider Wiosna prawdopodobnie było podstawą tworzenia proxy opartego na CGLIB (do obsługi @Transaction).

Po rozszerzeniu o ThreadProvider przy założeniu, że ThreadProvider rozszerza część interfejsu, Spring w tym przypadku tworzy proxy proxy Java Dynamic Proxy, które wydaje się być implementacją tego interfejsu, zamiast być typu ChisuraProvider.

Jeśli koniecznie trzeba używać ChisuraProvider można spróbować AspectJ jako alternatywa lub zmusić CGLIB oparciu pełnomocnika w przypadku z ThreadProvider także w ten sposób:

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

Oto bardziej odniesienie na ten temat od wiosny Reference site: http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/classic-aop-spring.html#classic-aop-pfb

+0

Co się stanie, jeśli moja klasa implementuje wiele interfejsów? – user1050619

+0

Czekaj ... po prostu uratowałeś mi życie. Użyłem wersji adnotacji @EnableAspectJAutoProxy (proxyTargetClass = true). Dziękuję Ci! –

7

Należy umieścić tę linię w kontekście aplikacji:

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

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

+0

Dodałem tę linię, w której ChiusuraProvider jest dołączony do pakietu com.cinebot.service, a ThreadProvider NIE jest zawarty w tym pakiecie ... ale to nie działa. – Tobia

+0

Czy wypróbowałeś odpowiedź @ BijuKunjummena (używając AOP o ustalonym zakresie AOP, pamiętaj o dodaniu zależności CGLIB)? – Xaerxess

Powiązane problemy