【问题标题】:Access application context from BundleContextAware class从 BundleContextAware 类访问应用程序上下文
【发布时间】:2010-11-30 16:02:30
【问题描述】:

我从现有的遗留战争中创建了一个 osgi 包。该应用程序有一个实现spring接口ApplicationContextAware的类,然后它使用上下文以编程方式获取bean(不知道为什么,但这最终需要重构)。该应用程序现在使用 OsgiBundleXmlApplicationContext,但我认为使用它存在问题,即 setApplicationContext 方法不会在任何实现 ApplicationContextAware 的类中被调用,因此现在此类中的上下文始终为空。

因此,作为一种解决方法,我实现了 BundleContextAware,以便我可以获取对已发布上下文的引用并以这种方式访问​​ bean。这可以正常工作,但是上下文中唯一的 bean 是 warDeployer(应该提到我正在使用 spring dm bundle spring-extender 来部署战争)。上下文中存在的包是我的包,所以我不明白为什么我得到的上下文中没有我的 bean。我必须获取应用程序上下文的代码是:

ServiceReference ref = bundleContext.getServiceReference(ApplicationContext.class.getName()); applicationContext = (OsgiBundleXmlApplicationContext) bundleContext.getService(ref);

我可以在日志中看到我的大部分上下文都在创建,所以我看不出为什么它们不在我得到的上下文中。

任何人都可以建议什么是错的吗?我知道这种方法有点老套,但在重构现有代码之前它是暂时的。

提前致谢。

巴里

【问题讨论】:

    标签: spring osgi springsource-dm-server


    【解决方案1】:

    我相信 ApplicationContext 服务是由 Spring-DM 扩展器异步注册的。所以你可能有一个竞争条件,即在服务实际注册之前请求服务。

    您可以引入延迟,但随后您将陷入令人讨厌的黑客领域。最好弄清楚为什么没有设置 ApplicationContextAware bean 上的 setApplicationContext 方法。您应该尝试提出这是针对 Spring-DM 的错误或在 Spring-DM Google Group 中提问。

    【讨论】:

    • 您好,感谢您的回复。我认为这可能是一个错误,因为我没有看到任何文档表明这不应该起作用。今年 3 月记录了一个 jira (jira.springframework.org/browse/OSGI-804),但没有针对它采取任何行动。我通过使用 BeanFactoryAware 接口解决了这个问题,它可以正常工作。谢谢
    • @user521065 .. 如果您收到此消息,您能否提供一些关于如何使用 BeanFactoryAware 接口解决此问题的指示?我用 BeanFactoryAware 替换了 ApplicationContextAware,但是 spring 仍然无法设置工厂,导致 null 值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-15
    • 2013-07-02
    相关资源
    最近更新 更多