2016-04-11 40 views
1

Soruma şudur: JavaS ya da tomcat gibi bir tür sunucu kapsayıcısına dağıtılmış bir uygulama oluştururken JavaSE uygulaması ve ServletModule gerçekleştirilirken neden AbstractModule oluşturmam gerekiyor? Aralarındaki farklar nelerdir?Jersey ve Google Guice tümleştirmesi

Jersey ile Guice'yi entegre etmem gerekiyor. Jersey’in Guice’in varlığını bir şekilde kullanmak için kayıt olması gerekli midir? Enjeksiyonları etkinleştirip istediğim her yere yapabilir miyim (normal sınıflar, filtreler, işleyiciler, hizmetler, DAO'lar vb.)? Ve neden sadece JavaSE uygulamasında olduğu gibi guver'i ayarlayamıyorum, bunun yerine ServletModule kullanmalıyım?

Web'de gördüğüm kadarıyla, Guice ve tersi olarak HK2 hizmetlerini kullanmanın birçok örneği var, bu yüzden bunu önemli olarak değerlendirebilir miyim? (Gerekli?)

sayesinde

cevap

4

bir AbstractModule Guice bootstrap (konfigürasyon) aşamasında temel yapı taşıdır. Her zaman bir ya da daha fazlasına ihtiyacın var. Öte yandan, bir ServletModule, bir servlet konteynerinde çalıştığı gerçeği göz önüne alındığında sizin için bazı yapılandırmalar yapan bir uzmanlık alanıdır. Guice documentation itibaren

:

Bu modül istek ve oturum kapsamları kurar ve adresinin filtreler ve servlet yapılandırmak için bir yer sağlar.

Guice-Jersey entegrasyonu hakkında kesinlikle ayarlamanız gerekir. Maviden işe yaramaz. Guice, diğer bağımlılık enjeksiyon çerçevesi gibi, , nesnelerini oluşturmanın kontrolüne sahip olduğunda çalışır. Şüphe duyduğunuzda, nesneyi kimin yarattığını kendinize sorun.

Jersey ve JAX-RS ile genel olarak nesneleri kim oluşturur? Sen değil, sadece onları tanımlarsın. Konteyner onları oluşturur. JAX-RS çalışma zamanı. Senin durumunda, Jersey çalışma zamanı. Ve Jersey, HK2 bağımlılık enjeksiyon çerçevesini dahili olarak kullanır. Bu nedenle, bazı Guice kaynakları ile tanımladığınız bir JAX-RS sınıfını enjekte etmek için köprüsüne köprüye ihtiyacınız vardır. Ya da başka bir şekilde! HK2-guice bridge'un nedeni budur. Yani Jersey, HK2 kullanarak nesnelerinizi kuracak ve HK2, köprüler sayesinde kaynaklarınızı Guice'de de arayacak.

Basit bir örnek. I use this code Guice kaynaklarını enjekte etmek istediğim bir REST API'sini başlatmak için.

@ApplicationPath("api") 
public class ApiRest extends ResourceConfig { 
    private static final Logger log = LoggerFactory.getLogger(ApiRest.class); 

    @Inject 
    public ApiRest(ServiceLocator serviceLocator, ServletContext servletContext) { 
     log.debug("Inicialitzant Jersey."); 
     packages("net.sargue.app.api"); 

     GuiceBridge.getGuiceBridge().initializeGuiceBridge(serviceLocator); 
     GuiceIntoHK2Bridge guiceBridge = serviceLocator.getService(GuiceIntoHK2Bridge.class); 
     Injector injector = (Injector) servletContext.getAttribute(Injector.class.getName()); 
     if (injector == null) 
      throw new RuntimeException("Guice Injector not found"); 
     guiceBridge.bridgeGuiceInjector(injector); 
    } 
} 

Yukarıdaki örnek bu ServletContext den Guice enjektörü çeker olarak ServletModule kayıtlı gerektiğini lütfen unutmayınız. Ya da enjektörü sadece ServletContext'a başka bir yere ekleyebilirsiniz. Ya da sadece REST API'sini başlatırken enjektörü yarat, tercihlerinize ve uygulamaya göre değişir.

+0

şimdi çok daha net görünüyor; temel olarak, örneğin, jax-rs kaynakları (uç noktalar), HK2 tarafından dahili olarak oluşturulur ve benim işim jax-r'leri bunun yerine guice kullanarak oluşturmasını söylemek mi? btw herhangi bir çalışan entegrasyon örneğiniz var mı? Dün web'de bulduğum her şeyi denedim ve kimse bana yardım etmedi .. hala boş göstergeler – azalut

+0

Bir örnekle güncellendi. Hayır, HK2 hala nesneleri yaratıyor ama şimdi sadece kayıt defterinde değil Guice'nin de kaynaklarına bakıyor. Umarım şimdi daha net olur. – sargue