2014-09-08 16 views
6

Chciałbym utworzyć pojedynczą instancję klasy, która nie jest zaangażowana w Jersey jako zasób lub usługa, a jednocześnie chciałaby, aby jego zależności zostały wstrzyknięte z usługi Jersey ServiceLocator.Jak uzyskać HK2 ServiceLocator na Jersey 2.12?

mogę zarejestrować tej klasy ręcznie w moim konstruktora ResourceConfig The ResourceConfig jest następnie przekazywany do metody fabryki Grizzly tak:

ResourceConfig resourceConfig = new DeviceServiceApplication(); 

LOGGER.info("Starting grizzly2..."); 
return GrizzlyHttpServerFactory.createHttpServer(BASE_URI, 
               resourceConfig, mServiceLocator); 

Problemem pozostaje, jak się odniesienie do Jersey ServiceLocator więc mogę wywołać createAndInitialize(), aby uzyskać mój obiekt z wstrzykniętymi zależnościami. Widzę w poprzednich wersjach z Jersey, że istnieją warianty konstruktorów, które oczekują ApplicationHandler'a, który oczywiście zapewnia dostęp do lokalizatora usług (jak inicjuję to inna sprawa). Możesz także zobaczyć, że próbowałem przejść w rodzicu ServiceLocator, ale oczywiście rozdzielczość jest wykonywana z potomka -> nadrzędny lokalizator, a nie w innym kierunku, więc prośba rodzica o mój obiekt nie działa, ponieważ typy Jersey @Contract i @Service nie są widoczne tutaj.

Czy muszę użyć czegoś innego niż GrizzlyHttpServerFactory? Czy poddaje się i ręcznie podłączam zależności singletona?

Odpowiedz

12

Udało mi się uzyskać odniesienie do ServiceLocator, rejestrując numer ContainerLifecycleListener.

W metodzie onStartup(Container container) zadzwoń pod numer container.getApplicationHandler().getServiceLocator().

W tym przykładzie zapisujemy referencję jako zmienną składową ResourceConfig, której można użyć w innym miejscu przez akcesor.

class MyResourceConfig extends ResourceConfig 
{ 
    // won't be initialized until onStartup() 
    ServiceLocator serviceLocator; 

    public MyResourceConfig() 
    { 
     register(new ContainerLifecycleListener() 
     { 
      public void onStartup(Container container) 
      { 
       // access the ServiceLocator here 
       serviceLocator = container.getApplicationHandler().getServiceLocator(); 

       // ... do what you need with ServiceLocator ... 
       MyService service = serviceLocator.createAndInitialize(MyService.class); 
      } 

      public void onReload(Container container) {/*...*/} 
      public void onShutdown(Container container) {/*...*/} 
     }); 
    } 

    public ServiceLocator getServiceLocator() 
    { 
     return serviceLocator; 
    } 
} 

wtedy gdzie indziej:

MyService service 
    = myResourceConfig.getServiceLocator().createAndInitialize(MyService.class); 
+0

jest to jedyny sposób? czy jest jakiś inny sposób? dostęp do cyklu życia kontenera wydaje się być przesadą. Dzięki – Architucas

+0

Innym alternatywnym rozwiązaniem jest: https://stackoverflow.com/questions/21149161/jersey-and-hk2-servicelocator/21998307#21998307 – ozhan

+0

Co to jest konfiguracja zasobów? i kiedy jest wywoływana ta klasa z wyjątkiem 'myResourceConfig.getServiceLocator()'? –

Powiązane problemy