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 参照を定義する方法はありますか? フレームワークの制限に合わせてコードをリファクタリングするのは嫌いです。