我的聲明式服務有問題。我有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>
爲什麼如果該服務被部署不在服務注入???
你最終解決了這個問題嗎?我目前面臨同樣的事情,並使用靜態變量來解決它,但這不適用於'一個服務實例/ servlet實例'的要求 – maasg 2011-11-28 12:20:56