2012-11-17 19 views
5

Napisałem pakiet OSGi, aby użyć go w mojej aplikacji eclipse 4 rcp. Korzystanie z usługi działa dobrze, jeśli dodam zależności, zarejestruję te usługi w moim aktywatorze i wstrzyknę je w moją klasę.Eclipse RCP 4 użyj pakietu za pośrednictwem usługi deklaratywnej

W aktywatora

IUserService service = new TestUserService(); 
context.registerService(IUserService.class.getName(), service, null); 

W mojej klasie

@Inject 
IUserService service; 

service.getSth(); 

Czytałem, że przy użyciu wiązek za pośrednictwem usług deklaratywnych powinien być lepszy sposób. Tak zmieniłem moją implementację. stworzyłem składnik definicji w moim zestawie, aby zapewnić moją usługę:

<?xml version="1.0" encoding="UTF-8"?> 
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="usermanagement.test"> 
    <implementation class="usermanagement.test.TestUserService"/> 
    <service> 
     <provide interface="usermanagement.IUserService"/> 
    </service> 
</scr:component> 

Potem usunięto rejestrację usługi z mojego aktywatora i stworzył klasę konsumentów usługę:

public class UserServiceConsumer { 

    private IUserService service; 

    public synchronized void setQuote(IUserService service) { 
     this.service = service; 
    } 

    public synchronized void unsetQuote(IUserService service) { 
     if (this.service == service) { 
      this.service = null; 
     } 
    } 

} 

i inną definicję składnika:

<?xml version="1.0" encoding="UTF-8"?> 
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="UserServiceConsumer"> 
    <implementation class="services.UserServiceConsumer"/> 
    <reference bind="setService" cardinality="1..1" interface="usermanagement.IUserService" name="IUserService" policy="static" unbind="unsetService"/> 
</scr:component> 

Po tych modyfikacjach wstrzyknięcie mojej porcji już nie działa. Problem polega na tym, że wstrzyknięte odwołanie do usługi ma wartość NULL za każdym razem.

Czy ktoś wie, dlaczego? Czy coś zapomniałem?

Wielkie dzięki!

Odpowiedz

2

Mogę zasugerować kilka rzeczy, które możesz zrobić, aby debugować.

  1. Czy rzeczywiście masz implementację scr w swoim środowisku wykonawczym? SCR (inna nazwa dla usług deklaratywnych) nie jest zawarta w rdzeniu Equinox, więc musisz go uwzględnić. Większość ludzi używa pakietu Felix SCR - będzie siedział bardzo szczęśliwie nad Equinox.

  2. Ponieważ usługi deklaracyjne korzystają tylko z usług, możesz zmienić połowę aplikacji jednocześnie, aby sprawdzić, czy nie działa usługa lub rejestracja usługi.

  3. Możesz również użyć konsoli Equinox, aby sprawdzić rejestrację swojej usługi. Użyj "ss", aby zidentyfikować swój pakiet, a następnie "pakuj [no]", aby zobaczyć, jakie usługi są zarejestrowane i zużyte. Jeśli używasz Felix SCR, istnieją również rozszerzenia konsoli Equinox, więc możesz użyć "listy scr", aby zobaczyć wszystkie usługi, które pakiet próbuje zarejestrować (i ich stan), oraz "scr info", aby uzyskać więcej szczegółów na temat konkretnego usługa.

2

Myślę, że usługi deklaratywne nie będą działać w klasie UI, ponieważ nie zostaną utworzone przez SCR, ale przez Eclipse. Możesz więc spróbować opuścić interfejs użytkownika, tak jak to było w przypadku @Inject, i zmienić tylko pakiet umożliwiający korzystanie z usługi DS.

Zasadniczo nie próbowałbym nawet zmieniać strony interfejsu. Notacje @Inject są znacznie mniej narzutowe niż usługi deklaratywne.

+0

Jak można wywnioskować, że OP chce skorzystać z usługi w klasie UI? – tkotisis

+0

Używam DI, aby utworzyć instancję mojej klasy przy użyciu adnotacji @Creatable na konstruktorze klasy. – roschulze

+0

@tkotsis, jeśli używasz Eclipse RCP, a następnie zwykle do zbudowania GUI –

3

Znalazłem rozwiązanie.

W pliku manifestu mojego serwisu Dodałem następujący wiersz:

Bundle-ActivationPolicy: lazy 

Po tym userServiceConsumer i definicja składnika w mojej aplikacji są niepotrzebne.

W klasie widoku mogę teraz zrobić co następuje:

public class MyPart { 

    private IUserService uServ; 

    @Inject 
    public MyPart(IUserService uServ) { 
     this.uServ = uServ; 
     if (uServ != null) 
      System.out.println("UserService available"); 
     else 
      System.out.println("UserService == null"); 
    } 

via di moja usługa jest wstrzykiwany w konstruktorze widoku. To działa dla mnie!

+0

Jeśli to rozwiąże Twój problem, powinieneś go również zaakceptować. –

Powiązane problemy