@Reference现场注入的OSGig服务随机出现"null"



我们有一个相当大的osgi应用程序,它由大约80个自定义服务捆绑包组成,在运行时还有20到30个第三方捆绑包依赖项(我们运行的是R7风格的osgi(。当我们开始这个项目时,我们通常会使用带有@Reference注释的服务的字段注入,并且没有任何问题,但现在,我们越来越多地看到,这些注入的依赖项有时会随机变为null——我们发现解决这个问题的一种方法是用服务的方法注入取代字段注入。

我注意到,注入的服务通常出现null的地方是在我们的组件服务中,它们实际上只是带有@component注释的Java类,但没有实现"ProviderType"或"ConsumerType"接口(我们的REST端点是这样的(。我们目前已经将这些组件的属性设置为"immediate=true",但这似乎对随机出现null的注入服务没有任何影响。

当我们检查捆绑包列表时,所有正确的捆绑包似乎都是活动的,有时甚至服务看起来都很好(没有不满意的引用(,这完全令人难以置信。

有谁可能对为什么会发生这种情况有所了解?

一些持续的异常/可能的原因:自项目开始以来,我们几乎在所有REST端点上都看到了以下错误,但不知道为什么框架认为它看到了重复的类和方法。两个

fully.qualified.class.path.CustomServiceRest#doStuff和fully.qualiified.class.path.CustomeServiceRest#doStuff是处理当前请求的同等候选者,这可能会导致不可预测的结果2018年12月13日下午2:41:45 org.apache.cxf.jaxrs.model.OperationResourceInfoComparator比较警告:完全合格.class.path.CustomServiceRest#doSomeOtherStuff和完全合格.cclass.path.CCustomServiceRest#doSomeOtherStuff都是处理当前请求的同等候选者,这可能会导致不可预测的结果

最近,我们添加了一个osgi WebSocket服务,该服务需要添加另一个Jetty依赖捆绑包,并且有人担心这两个Jetty捆绑包在运行时混合中表现良好。

在与这个问题进行了大量的争论之后,我们发现了什么-我们的每个RestEndpoint捆绑包都包含一个JaxRsApp类,该类extnends javax.ws.rs.core.Application,我们正在Overridden getClasses((方法中将我们的每个RestEndpoint静态类添加到Set>集合中,然而,我们的每个RestEntpoints类都用@Component注释,并且每个@Component都将服务属性设置为相应的endoints类名,因此,我们认为每个类都被注册了两次(一次由JaxRsApp注册,一次由SCR使用@Component表示法注册(,因此,每当我们使用Postman测试或UI进行rest调用时,都会出现重复的警告消息。

此外,通过从JaxRsApp文件中删除静态注册(因此我们现在只使用SCR注册restendpoint组件(,不仅警告消失了,而且空服务问题也得到了解决。因此,我们相信,在更改之前,SCR实际上是在注入依赖性服务,但不知何故,由于"重复"的服务端点,依赖性服务被注入到JaxRsApp注册的服务类中?我不能百分之百肯定,所以如果这里有人能解释一下,我会非常感激的。

无论如何,它现在起作用了。

最新更新