Spring ожидается как минимум 1 bean, который квалифицируется как кандидат autwire для этой зависимости - программирование

Spring ожидается как минимум 1 bean, который квалифицируется как кандидат autwire для этой зависимости

У меня есть проблема с этим Autowire:

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

Я видел, что я не получил эту ошибку, если я удаляю extends ThreadProvider для автосортированного класса, но мне действительно нужен абстрактный класс ThreadProvider.

4b9b3361

Ответ 1

Если в любом месте иерархии ThreadProvider есть интерфейс, попробуйте поместить имя интерфейса в качестве типа вашего поставщика услуг, например. если вы сказали эту структуру:

public class ThreadProvider implements CustomInterface{
...
}

Затем в контроллере попробуйте следующее:

@Controller
public class ChiusuraController {

    @Autowired
    private CustomInterface chiusuraProvider;
}

Причина, по которой это происходит, в вашем первом случае, когда у вас НЕ было ChiusuraProvider extend ThreadProvider Spring, вероятно, лежало в основе создания прокси-сервера на основе CGLIB для вас (для обработки @Transaction).

Когда вы DID расширяетесь из ThreadProvider, предполагая, что ThreadProvider расширяет некоторый интерфейс, Spring в этом случае создает прокси на основе Java Dynamic Proxy, который, как представляется, является реализацией этого интерфейса вместо типа ChisuraProvider.

Если вам абсолютно необходимо использовать ChisuraProvider, вы можете попробовать AspectJ в качестве альтернативы или заставить прокси-сервер на основе CGLIB в случае с ThreadProvider также следующим образом:

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

Вот несколько ссылок на этот сайт с сайта Spring: http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/classic-aop-spring.html#classic-aop-pfb