OSGi服务引用不使用构造函数注入

时间:2015-03-12 13:35:45

标签: spring dependency-injection osgi spring-dm

我有一个捆绑包(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引用?我讨厌围绕框架的限制来重构代码。

1 个答案:

答案 0 :(得分:0)

您可能需要将其添加到beans.xml:

<context:annotation-config/>

您可能需要使用的替代方案:

@Autowired
public yourconstructor(@Qualifier("platformTransactionManager")  PlatformTransactionManager ptm)