web-dev-qa-db-ja.com

Springは、この依存関係の自動配線候補としてふさわしい少なくとも1つのBeanを期待していました

この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抽象クラスが必要です。

18
Tobia

ThreadProvider階層のどこかにインターフェイスがある場合は、インターフェイスの名前をサービスプロバイダーのタイプとして指定してみてください。この構造を言う場合:

public class ThreadProvider implements CustomInterface{
...
}

次に、コントローラーでこれを試してください:

@Controller
public class ChiusuraController {

    @Autowired
    private CustomInterface chiusuraProvider;
}

これが発生する理由は、最初のケースでは、DID NOT have ChiusuraProvider extend ThreadProvider SpringがCGLIBベースのプロキシを作成するための基礎になっている可能性がある場合です。 (@Transactionを処理するため)。

DID extend from ThreadProviderから拡張すると、ThreadProviderが何らかのインターフェイスを拡張すると仮定すると、その場合のSpringはJava Dynamic Proxy based Proxyを作成します。 ChisuraProvider型ではなく、そのインターフェイスの実装のように見えます。

絶対にChisuraProviderを使用する必要がある場合は、AspectJを代替として試すか、ThreadProviderを使用する場合のCGLIBベースのプロキシを次のように強制できます。

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

これについては、Spring Referenceサイトからの参照がいくつかあります。 http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/classic-aop-spring.html #classic-aop-pfb

18
Biju Kunjummen

次の行をアプリケーションコンテキストに配置する必要があります。

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

クラスの自動検出とBean定義の登録についてのドキュメントを参照 .

7
Xaerxess