我的声明服务有问题。我有2个捆绑包,一个是服务器提供商,另一个是使用该服务的用户界面。
在服务器端,实现是:
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软件包。
客户端是GWT用户界面,然后我将服务引用注入GWT的服务器端。好吧,当我在Equinox上部署应用程序时,它会运行,但是当我按下按钮时,我会启动一个事件来调用ZBService。我调试了应用程序,错误是zb属性为null。也就是说,依赖性是注入的。但是,这些服务在Equinox上公开。如果我在Equinox控制台上编写服务,则会部署服务。然后,我的结论是错误是由于注射不执行。
我想知道是否有人知道是什么原因?
提前多多感谢!!
美好的一天
编辑:
我做了你的建议,但它没有运行。我更改了组件名称和condinality / policy。结果是一样的 - &gt;由于注入而导致的NullPointerException未完成。
此外,我调试应用程序以查看是否调用了方法bind和/或unbind,但它们不是。
完整的课程是:
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 :(得分:2)
以下列出了您可以尝试的事项:
答案 1 :(得分:1)
你有两个具有相同名称的组件,在讨论它们时有点尴尬。
客户端的引用具有:cardinality =“0..n”policy =“dynamic”。这意味着它可以通过零到n个引用激活。但是你的代码没有处理这个问题。它似乎只需要一个参考。也许你应该使用cardinality =“1..1”policy =“static”。