1

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

4

1 回答 1

0

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

<context:annotation-config/>

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

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