1

Hibernate トランザクション マネージャーを OSGi サービスとしてエクスポートするバンドル (A) を持っています。サービス インターフェイスはPlatformTransactionManager.

別のバンドル (B) で、その OSGi サービスへの参照を定義します。バンドル B は、をコンストラクタ パラメータとしてReservationDao取るBean を定義します。PlatformTransactionManagerコンストラクターは でマークされてい@Autowiredます。

アプリケーション コンテキストが読み込まれると、次のエラーが(多くの場合)スローされることがあります。

Unsatisfied dependency expressed through constructor argument with index 1 of type [org.springframework.transaction.PlatformTransactionManager]: : No matching bean of type [org.springframework.transaction.PlatformTransactionManager] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [org.springframework.transaction.PlatformTransactionManager] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:513)
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:92)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:284)
... 20 more

基本的に、利用可能な Bean がないため、自動配線は失敗しますPlatformTransactionManager。フィールド注入でも同じエラーが発生します。

セッター メソッドを作成して でマークすると@Autowire、アプリケーション コンテキストが正しく読み込まれます。

コンストラクターとフィールドのオートワイヤーが失敗する可能性があるのに、セッターのオートワイヤーが常に成功する理由を説明できる人はいますか? すべての自動配線が機能するように OSGi 参照を定義する方法はありますか? フレームワークの制限に合わせてコードをリファクタリングするのは嫌いです。

4

1 に答える 1

0

これを beans.xml に追加する必要がある場合があります。

<context:annotation-config/>

あなたが使用する必要があるかもしれない代替:

@Autowired
public yourconstructor(@Qualifier("platformTransactionManager")  PlatformTransactionManager ptm)
于 2015-10-02T17:57:56.490 に答える