Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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中的bundleContext.getServiceReference_Java_Nullpointerexception_Osgi - Fatal编程技术网

Java Osgi中的bundleContext.getServiceReference

Java Osgi中的bundleContext.getServiceReference,java,nullpointerexception,osgi,Java,Nullpointerexception,Osgi,在Applet Activator类中运行Java应用程序时遇到问题 gui bundleContext.getServiceReference抛出了一个NPE,在OSGi中进行了一些搜索后,我发现这是因为没有注册任何实现UIService的服务。。 我的问题是:这意味着什么?我应该检查什么来修复它 错误代码: java.lang.NullPointerException at net.java.sip.communicator.impl.appletActivator.AppletActiva

在Applet Activator类中运行Java应用程序时遇到问题 gui bundleContext.getServiceReference抛出了一个NPE,在OSGi中进行了一些搜索后,我发现这是因为没有注册任何实现UIService的服务。。 我的问题是:这意味着什么?我应该检查什么来修复它

错误代码:

java.lang.NullPointerException
at net.java.sip.communicator.impl.appletActivator.AppletActivator.openMainGui(AppletActivator.java:57)
at net.java.sip.communicator.impl.appletActivator.AppletActivator.start(AppletActivator.java:40)
at org.apache.felix.framework.util.SecureAction$Actions.run(SecureAction.java:1243)
at java.security.AccessController.doPrivileged(Native Method)
at org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:620)
at org.apache.felix.framework.Felix.activateBundle(Felix.java:1904)
at org.apache.felix.framework.Felix.startBundle(Felix.java:1822)
at org.apache.felix.framework.Felix.setActiveStartLevel(Felix.java:1192)
at org.apache.felix.framework.StartLevelImpl.run(StartLevelImpl.java:266)
at java.lang.Thread.run(Unknown Source)
资料来源:

public static <T> T getService(BundleContext bundleContext,
        Class<T> serviceClass) {
            //This throws the NullPointerException
    ServiceReference serviceReference = bundleContext 
            .getServiceReference(serviceClass.getName());

    return (serviceReference == null) ? null : (T) bundleContext
            .getService(serviceReference);
}
public static T getService(BundleContext BundleContext,
类(服务类){
//这将抛出NullPointerException
ServiceReference ServiceReference=bundleContext
.getServiceReference(serviceClass.getName());
返回(serviceReference==null)?null:(T)bundleContext
.getService(服务参考);
}

我是OSGi新手,不了解其中的一些概念。

框架中是否安装了一些包来注册UIService?此外,您的代码可能对启动顺序敏感,这在OSGi中是不允许的。调用getService方法并期望它返回服务时,假定注册该服务的捆绑包(a)已经启动,并且(b)已经注册了该服务。这就是为什么您通常在OSGi应用程序中使用DS或ServiceTracker来解耦捆绑包的开始顺序。

当堆栈跟踪指向AppletActivator.openMainGui函数作为顶部时,您在getService()函数中说“fails here”有点奇怪。您是否可能只复制了异常堆栈跟踪的顶部,而没有复制更重要的“原因”部分?抱歉,我的意思是函数调用抛出NullPointerException,OpenMainGui调用getService..这是记录器的最后一个输出,在应用程序停止之后,UIService被注册,几个捆绑包已经获得服务引用。是的,但是它是在捆绑包尝试获得服务时注册的吗?包含UIService类型的包是否有多个导出器?您的捆绑包是否导入并连接到与注册服务的捆绑包相同的包(包含UIService类型)?经过一番挖掘后,我发现捆绑包当时没有注册-但是其他捆绑包如何调用相同的方法?我们正在迁移到另一个代码,因此在OSGi中会出现很多问题。。。所以包注册了我需要的服务,我不需要再注册它来使用它?有很多包可以开始使用(以某种顺序)。一些希望使用服务的bundle将在注册服务的bundle之前启动,而一些bundle将在注册服务的bundle之后启动。因为您不想控制启动顺序,所以使用服务的bundle不需要依赖于在其BundleActivator执行期间注册的服务。这就是为什么要使用声明性服务或ServiceTracker来使用服务。