【问题标题】:OSGi Service references not working with constructor injectionOSGi 服务引用不适用于构造函数注入
【发布时间】:2015-05-14 16:44:40
【问题描述】:

我有一个捆绑包 (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 标记这些方法,则应用程序上下文会正确加载。

谁能解释为什么构造函数和字段自动装配可能会失败,但设置器自动装配总是成功?有没有办法以所有自动装配工作的方式定义 OSGi 引用?我不想围绕框架的限制重构代码。

【问题讨论】:

    标签: spring dependency-injection osgi spring-dm


    【解决方案1】:

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

    <context:annotation-config/>
    

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

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

    【讨论】:

    • 我假设(也许这是个问题)如果 setter 注入不需要限定符,那么 注入也不应该。我已经放弃自己假设在导出的 bean 实际完成其初始化之前 OSGi 服务引用可以存在的一些 OSGi 废话,并且自动装配过程将其解包到不存在的(空)bean 实例。
    猜你喜欢
    • 2019-11-12
    • 2018-01-17
    • 2012-05-08
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-03
    相关资源
    最近更新 更多