我有一个捆绑包(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
基本上,自动装配失败是因为没有可用的bean是PlatformTransactionManager
。现场注射会发生同样的错误。
如果我创建了setter方法并用@Autowire
标记了这些方法,则应用程序上下文会正确加载。
任何人都可以解释为什么构造函数和字段自动装配可能会失败,但是setter autowiring总是成功吗?有没有办法以所有自动装配工作的方式定义OSGi引用?我讨厌围绕框架的限制来重构代码。
答案 0 :(得分:0)
您可能需要将其添加到beans.xml:
<context:annotation-config/>
您可能需要使用的替代方案:
@Autowired
public yourconstructor(@Qualifier("platformTransactionManager") PlatformTransactionManager ptm)