3

我从现有的遗留战争中创建了一个 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);

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

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

提前致谢。

巴里

4

1 回答 1

1

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

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

于 2010-12-03T01:08:31.490 回答