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".