OSGi Декларативные услуги - исключение NullPointer

У меня проблема с моими декларативными услугами. У меня есть 2 пакета, один является поставщиком сервера, а другой - пользовательским интерфейсом, который использует сервис.

На стороне сервера реализация:

public boolean checkUser(){
    return true;
}

И файл XML внутри папки OSGi-INF:

<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 в файл манифеста и развернул комплект Equinox DS, который является ACTIVE.

Клиент - это пользовательский интерфейс GWT, затем я вставляю ссылку на службу в серверную часть GWT. Хорошо, когда я развертываю приложение в Equinox, оно запускается, но когда я нажимаю кнопку, я запускаю событие для вызова ZBService. Я отладил приложение, и ошибка ZB атрибут является нулевым. То есть зависимость не вводится. Однако услуги выставляются на равноденствие. Если я пишу сервисы на консоли 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>

Почему сервис не внедряется, если сервис развернут???

2 ответа

Решение

Вот список вещей, которые вы можете попробовать:

  • Во-первых, удалите "статические" из zb, это может быть проблемой.
  • Если вы используете Equinox, добавьте флаг -Dequinox.ds.print=true к аргументам виртуальной машины и посмотрите больше информации о разборе XML и т. Д.
  • Конечно, добавьте sysouts в setZB и unsetZB:)
  • Помните, что для реализации IZBService нужен конструктор без аргументов
  • Если вы используете Equinox, используйте команду "list -c" для получения информации о каждом компоненте (это здорово, потому что точно говорит, почему компонент не зарегистрирован).
  • Установите "inmediate=true" в XML для принудительной немедленной активации.

У вас есть оба компонента с одинаковым именем, что довольно неудобно при обсуждении.

Ссылка на стороне клиента имеет: cardinality="0..n" policy="dynamic". Это означает, что его можно активировать с нуля до n ссылок. Тем не менее, ваш код не обрабатывает это. Кажется, ожидается ровно одна ссылка. Возможно, вам следует использовать cardinality="1..1" policy="static".

Другие вопросы по тегам