Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何向其使用者提供与OSGi声明性服务相同的对象?_Java_Maven_Osgi_Equinox_Declarative Services - Fatal编程技术网

Java 如何向其使用者提供与OSGi声明性服务相同的对象?

Java 如何向其使用者提供与OSGi声明性服务相同的对象?,java,maven,osgi,equinox,declarative-services,Java,Maven,Osgi,Equinox,Declarative Services,我有一个场景,我需要在OSGi应用程序中的几个捆绑包中将同一个对象作为声明性服务公开。更具体地说,有一个类作为DeclarDevice服务(Service1)公开。有几个服务消费者。我正在使用maven scr插件生成scr描述符。服务使用者对服务接口的引用如下所示 @Reference(name = "Service1",bind = "bindService1", unbind = "unbindService1", policy = ReferencePolicy.STATIC

我有一个场景,我需要在OSGi应用程序中的几个捆绑包中将同一个对象作为声明性服务公开。更具体地说,有一个类作为DeclarDevice服务(Service1)公开。有几个服务消费者。我正在使用maven scr插件生成scr描述符。服务使用者对服务接口的引用如下所示

@Reference(name = "Service1",bind = "bindService1",
      unbind = "unbindService1", policy = ReferencePolicy.STATIC)
ServiceInterface1 service1;

protected void bindService1(ServiceInterface1 service1) {
    this.service1 = service1;
}

protected void unbindService1(ServiceInterface1 service1) {
    this.service1 = null;
}
此服务提供程序(Service1)是另一个服务(Service2)的服务使用者。因此,Service1也将引用Service2

@Service
@Component(immediate = true, name = "Service1")
public class Service1 implements ServiceInterface1{

    @Reference(name = "Service2",bind = "bindService2",
      unbind = "unbindService2", policy = ReferencePolicy.STATIC)
    ServiceInterface2 service2;

    protected void bindService2(ServiceInterface2 service2) {
        this.service2 = service2;
    }

    protected void unbindService2(ServiceInterface2 service2) {
        this.service2 = null;
    }
}
这就是我的服务2的样子

@Service
@Component(immediate = true, name = "Service2")
public class Service2 implements ServiceInterface2 {
    .....
}
我遇到的问题是,我可以看到Service1和服务使用者的绑定方法由OSGi容器调用,但是绑定到服务使用者中引用Service1的对象没有初始化其service2引用。这意味着当我从服务使用者使用service1对象时,我会得到一个空指针异常,因为service1对象中没有service2对象。
绑定到service1的对象与OSGi容器用于绑定引用service2的对象不同。我希望在所有服务使用者中使用相同的对象。这可以解决吗?

是否有多个服务提供商2?您是否看到service1组件中service2的bind方法实际上被调用了?是否已解决服务1的所有其他引用?如果服务1的强制引用尚未实现,则不会激活该引用。(我喜欢使用ApacheWeb控制台的组件概述来检查组件的状态,这通常会有所帮助。)只有一个service2提供程序。调用service1中service2的bind方法,并解析service1的所有引用。但是service1使用者中的service1对象的service2对象为null。所以我得到了NPE,然后你做错了什么。对于每个组件(不包括工厂组件),只有一个java对象被传递并绑定到其他引用服务。您是否正确存储了对象?你为此写过单元测试吗?我怀疑上面的代码是原创的,也许你应该发布那些实际上失败的代码,这样社区就可以看一看了。