2013-10-28 18 views
0

我在運行Java應用程序時遇到問題,在Applet Activator類中打開 gui bundleContext.getServiceReference在OSGi中進行一些搜索後拋出一個NPE它在我看來是因爲存在沒有服務註冊,實現了UIService .. 我的問題是:這是什麼意思?我應該檢查什麼來解決它?osgi中的bundleContext.getServiceReference

錯誤代碼:

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); 
} 

我是新來的OSGi,不明白的一些概念。

+0

在getService()函數中,當你說「失敗」時有點奇怪,而你的堆棧跟蹤指向AppletActivator.openMainGui函數。是否有可能您只複製了異常堆棧追蹤的頂部,而不是更重要的「引發者」部分? –

+0

對不起,我的意思是函數調用拋出NullPointerException,並且OpenMainGui調用getService .. –

+0

這就是記錄器的最後一個輸出,之後應用程序停止 –

回答

1

是否在註冊UIService的框架中安裝了一些軟件包?另外,你的代碼看起來可能是開始命令敏感的,這在OSGi中是不可能的。調用你的getService方法並期待它返回一個服務,假定註冊該服務的bundle已經(a)已經啓動並且(b)已經註冊了該服務。這就是爲什麼您通常在OSGi應用程序中使用DS或ServiceTracker來解耦綁定的啓動順序的原因。

+0

UIService被註冊,並且一些bundle已經獲得服務引用。 –

+0

是的,但它是在您的軟件包試圖獲得服務時註冊的嗎?包含UIService類型的包有多個出口商嗎?您的軟件包是否與註冊該服務的軟件包導入並連線到相同的軟件包(包含UIService類型)? –

+0

經過一番挖掘,我發現捆綁包沒有在時間註冊 - 但其他捆綁包如何調用相同的方法?我們正在遷移到另一個代碼,以便在OSGi中打開很多問題...因此,註冊了我需要的服務的捆綁包,我不需要再註冊它來使用它? –