我有一个捆绑包 (A),它将 Hibernate 事务管理器导出为 OSGi 服务,服务接口为PlatformTransactionManager
.
在另一个包 (B) 中,我定义了对该 OSGi 服务的引用。Bundle B 定义了一个 bean,ReservationDao
,它以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
基本上,自动装配失败是因为没有可用的PlatformTransactionManager
. 现场注入也会发生同样的错误。
如果我创建 setter 方法并用 标记它们@Autowire
,则应用程序上下文会正确加载。
谁能解释为什么构造函数和字段自动装配可能会失败,但设置器自动装配总是成功?有没有办法以所有自动装配工作的方式定义 OSGi 引用?我不想围绕框架的限制重构代码。