OSGi声明性服务-空指针异常

OSGi声明性服务-空指针异常,osgi,declarative-services,Osgi,Declarative Services,我的声明性服务有问题。我有两个包,一个是服务器提供程序,另一个是使用服务的用户界面 在服务器端,实现是: public boolean checkUser(){ return true; } public class GreetingServiceImpl extends RemoteServiceServlet implements GreetingService{ IZBService zb; public void setZBService(IZBService e

我的声明性服务有问题。我有两个包,一个是服务器提供程序,另一个是使用服务的用户界面

在服务器端,实现是:

public boolean checkUser(){
    return true;
}
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();
   }
}
以及OSGi INF文件夹中的XML文件:

<component name="ZBService">
<implementation class="service.ZBService" />
   <service>
     <provide interface="service.IZBService" />
   </service>
</component>
和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>
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>


如果部署了服务,为什么不注入服务?

两个组件的名称相同,这在讨论它们时有点尴尬


客户端上的引用具有:cardinality=“0..n”policy=“dynamic”。这意味着它可以通过0到n个引用激活。但是您的代码不能处理这个问题。它似乎只期望一个参考。也许您应该使用cardinality=“1..1”policy=“static”

以下是您可以尝试的事项列表:

  • 首先,删除zb的“静态”,这可能是问题所在
  • 如果您使用的是Equinox,请将-Dequinox.ds.print=true标志添加到VM参数中,并查看有关解析XML等的更多信息
  • 当然,将sysout添加到setZB和unsetZB:)
  • 请记住,IZBService实现需要一个不带参数的构造函数
  • 如果使用Equinox,请使用“list-c”命令获取每个组件的信息(这很酷,因为它确切地说明了组件未注册的原因)
  • 将XMLs中的“inmediate=true”设置为强制Inmediately激活

我采纳了你的建议,但没有成功。我更改组件名称和条件/策略。结果是相同的-->NullPointerException,因为注入未完成。您最终解决了此问题吗?我目前面临着同样的问题,并使用静态变量解决了它,但对于“一个服务实例/servlet实例”的需求来说,这是行不通的
<?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>