宣言型サービスに問題があります。2つのバンドルがあります。1つはサーバープロバイダーで、もう1つはサービスを使用するユーザーインターフェイスです。
サーバー側では、実装は次のとおりです。
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であるequinoxdsバンドルをデプロイしました。
クライアントはGWTユーザーインターフェイスであり、GWTのサーバー側にサービス参照を挿入します。Equinoxにアプリケーションをデプロイすると実行されますが、ボタンを押すと、ZBServiceを呼び出すイベントを起動します。アプリケーションをデバッグしましたが、エラーはzb属性がnullです。つまり、依存関係は注入されません。ただし、サービスはEquinoxで公開されています。Equinoxコンソールでサービスを作成すると、サービスが展開されます。次に、私の結論は、エラーは注入が実行されないためです。
誰かが理由を知っているかどうか知りたいですか?
よろしくお願いします!!
いい日
編集:
私はあなたの提案をしましたが、それは実行されません。コンポーネント名と条件/ポリシーを変更します。結果は同じです->インジェクションが行われないため、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>
サービスがデプロイされている場合、なぜサービスが注入されないのですか?