2011-05-27 68 views
1

我的聲明式服務有問題。我有2個捆綁包,一個是服務器提供者,另一個是使用該服務的用戶界面。OSGi聲明式服務 - 空指針異常

在服務器端,實現如下:

public boolean checkUser(){ 
    return true; 
} 

而且裏面OSGi的INF文件夾中的XML文件:

<component name="ZBService"> 
<implementation class="service.ZBService" /> 
    <service> 
    <provide interface="service.IZBService" /> 
    </service> 
</component> 

在客戶端,實現如下:

public class GreetingServiceImpl extends RemoteServiceServlet implements GreetingService{ 
    IZBService zb; 

    public void setZBService(IZBService eventAdmin) { 
     this.zb = eventAdmin; 
    } 

    public void unsetZBService(IZBService eventAdmin){ 
     if(this.zb == eventAdmin){ 
      this.zb = null;} 
    } 
    public boolean greetServer(String input, String input2) throws Exception { 
     return zb.checkUser(); 
    } 
} 

和XML文件:

<component name="ZBService"> 
    <implementation class="main.java.com.gwt.app.server.GreetingServiceImpl" /> 
    <service> 
     <provide interface="main.java.com.gwt.app.client.GreetingService"/> 
    </service> 
    <reference name="zb" interface="service.IZBService" bind="setZBService" unbind="unsetZBService" cardinality="0..n" policy="dynamic" /> 
</component> 

另外,我已經在清單文件中包含了標記Service-Component,並且我部署了ACTIVE的equinox ds bundle。

客戶端是一個GWT用戶界面,然後我將服務引用注入到GWT的服務器端。那麼,當我在Equinox上部署應用程序時,它會運行,但是當我按下按鈕時,我會啓動一個事件來調用ZBService。我調試了應用程序,錯誤是zb屬性爲null。也就是說,依賴性沒有被注入。然而,這些服務暴露在Equinox上。如果我在Equinox控制檯上編寫服務,則會部署這些服務。然後,我的結論是錯誤是由於注射不執行。

我想知道是否有人知道是什麼原因?

非常感謝!

尼斯一天

編輯:

我做了你的建議,但它不運行。我更改組件名稱和condinality/policy。結果是一樣的 - >由於注入沒有完成的NullPointerException。

此外,我調試應用程序,看看方法綁定和/或解除綁定調用,但他們不是。

完整的類是:

public class GreetingServiceImpl extends RemoteServiceServlet implements GreetingService{ 
static protected IZBService zb; 

public GreetingServiceImpl(){ 
    System.out.println("Constructor GreetingServiceImpl"); 
} 

public IZBService getZb() { 
    return zb; 
} 

public void setZb(IZBService zb) { 
    GreetingServiceImpl.zb = zb; 
} 

public void unsetZb(IZBService zb) { 
    GreetingServiceImpl.zb = zb; 
} 

@Override 
protected void service(HttpServletRequest req, HttpServletResponse resp) 
     throws ServletException, IOException { 
    // Cache the current thread 
    Thread currentThread = Thread.currentThread(); 
    // We are going to swap the class loader 
    ClassLoader oldContextClassLoader = currentThread.getContextClassLoader(); 
    currentThread.setContextClassLoader(this.getClass().getClassLoader()); 
    super.service(req, resp); 
    currentThread.setContextClassLoader(oldContextClassLoader); 
} 

public void activate(ComponentContext context) { 
    System.out.println("Creating new greeter for " + context.getProperties().get("name") 
      + ": " + context.getComponentInstance().toString()); 
} 

public void activate() { 
    System.out.println("Activando la referencia al servicio"); 
} 

public void deactivate(ComponentContext context) { 
    System.out.println("Deactivating greeter for " + context.getProperties().get("name") 
      + ": " + context.getComponentInstance().toString()); 
} 

public boolean greetServer(String input, String input2) throws Exception { 
    return zb.checkUser(); 
} 
} 

和XML客戶端:

<?xml version="1.0" encoding="UTF-8" ?> 
<scr:component name="serviceZB" xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0"> 
<implementation class="main.java.com.gwt.app.server.GreetingServiceImpl" /> 
<!-- <service> 
    <provide interface="main.java.com.gwt.app.client.GreetingService"/> 
</service> --> 
<reference name="zb" interface="service.IZBService" 
    bind="setZb" unbind="unsetZb" cardinality="1..1" 
    policy="static" /> 
</scr:component> 

爲什麼如果該服務被部署不在服務注入???

+0

你最終解決了這個問題嗎?我目前面臨同樣的事情,並使用靜態變量來解決它,但這不適用於'一個服務實例/ servlet實例'的要求 – maasg 2011-11-28 12:20:56

回答

2

這裏的事情的清單,你可以嘗試:

  • 首先,刪除的ZB的「靜態」,這可能是問題。
  • 如果使用的是春分,添加-Dequinox.ds.print = true標誌的VM參數和查看關於解析個XML的詳細信息等
  • 當然,加sysouts到setZB和unsetZB :)
  • 請記住,IZBService的實現需要構造函數沒有參數
  • 如果您使用的是Equinox,請使用「list -c」命令來獲取每個組件的信息(因爲說明組件未註冊的原因很酷)。
  • 在XML中設置「inmediate = true」以強制內部激活。
1

你有兩個名稱相同的組件,在討論它們時有點尷尬。

客戶端的參考文獻有:cardinality =「0..n」policy =「dynamic」。這意味着它可以用零到n參考激活。然而你的代碼不處理這個。它似乎期待一個參考。也許你應該使用cardinality =「1..1」policy =「static」。

+0

我做了你的建議,但它沒有運行。我更改組件名稱和condinality/policy。結果是一樣的 - >由於注入沒有完成的NullPointerException。 – 2011-05-30 05:27:36