18

このAutowireに問題があります:

@Controller
public class ChiusuraController {

    @Autowired
    private ChiusuraProvider chiusuraProvider;
}

この豆で:

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

自動配線クラスのextendsThreadProviderを削除してもこのエラーが発生しないことを 確認しまし たが、実際にはThreadProvider抽象クラスが必要です。

4

2 に答える 2

19

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

public class ThreadProvider implements CustomInterface{
...
}

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

@Controller
public class ChiusuraController {

    @Autowired
    private CustomInterface chiusuraProvider;
}

これが発生する理由は、 Spring をChiusuraProvider拡張していない最初のケースでは、ThreadProviderおそらく CGLIB ベースのプロキシを作成する (@Transaction を処理する) ためです。

ThreadProvider が何らかのインターフェースを拡張すると仮定してDID を拡張すると、その場合、Spring は Java Dynamic Proxy ベースのプロキシを作成します。これは、タイプThreadProviderではなく、そのインターフェースの実装のように見えます。ChisuraProvider

絶対に使用する必要がある場合はChisuraProvider、代わりに AspectJ を試すか、ThreadProvider の場合は次の方法で CGLIB ベースのプロキシを強制することができます。

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

Spring Reference サイトからのこれに関するその他の参照を次に示します。-pfb

于 2012-07-04T18:56:02.553 に答える
7

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

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

クラスの自動検出と Bean 定義の登録について詳しくは、ドキュメントを参照してください。

于 2012-07-04T16:29:13.250 に答える