2015-09-15 54 views
0

我在獨立的灰熊網絡服務器上使用澤西島2。 HK2用於CDI。我想通過@PerLookup -scope獲得服務ContainerRequestFilterContainerRequestFilter每個查詢注入不注入每個請求

服務:

import org.glassfish.hk2.api.PerLookup; 
import org.jvnet.hk2.annotations.Service; 

@Service 
@PerLookup 
public class SessionManager { 

    [...] 
} 

過濾器:

import javax.annotation.Priority; 
import javax.inject.Inject; 
import javax.ws.rs.Priorities; 
import javax.ws.rs.container.ContainerRequestContext; 
import javax.ws.rs.container.ContainerRequestFilter; 
import javax.ws.rs.container.PreMatching; 
import javax.ws.rs.ext.Provider; 

@Provider 
@Priority(Priorities.AUTHENTICATION) 
@PreMatching 
public class HttpSessionFilter implements ContainerRequestFilter { 
    @Inject 
    private javax.inject.Provider<org.glassfish.grizzly.http.server.Request> requestProvider; 

    @Inject 
    private SessionManager sessionManager; 

    [...] 

} 

我的問題是這樣的:

  • 過濾器被實例化一次(啓動)
  • 的服務注入一次(在過濾器啓動時)
  • 所有下游都發生在單身範圍內

問題:我怎樣才能獲得按請求注入的服務?

更新

使用@Inject javax.inject.Provider<SessionManager> sessionManagerProvider建議的方法具有邏輯意義的我,但sessionManagerProvider.get()返回null。

hk2 serviceLocator通過居民生成器填充。據報道:

SystemDescriptor(
    implementation=com.skalio.skaliopush.http.SessionManager 
    contracts={com.skalio.skaliopush.http.SessionManager} 
    scope=org.glassfish.hk2.api.PerLookup 
    qualifiers={} 
    descriptorType=CLASS 
    descriptorVisibility=NORMAL 
    metadata= 
    rank=0 
    loader=null 
    proxiable=null 
    proxyForSameScope=null 
    analysisName=null 
    id=31 
    locatorId=0 
    identityHashCode=494317290 
    reified=false) 

如果我添加了明確的約束,那麼它也發現是這樣的:

SystemDescriptor(
    implementation=com.skalio.skaliopush.http.SessionManager 
    contracts={com.skalio.skaliopush.http.SessionManager} 
    scope=org.glassfish.jersey.process.internal.RequestScoped 
    qualifiers={} 
    descriptorType=CLASS 
    descriptorVisibility=NORMAL 
    metadata= 
    rank=0 
    [email protected]29e6 
    proxiable=null 
    proxyForSameScope=null 
    analysisName=null 
    id=39 
    locatorId=0 
    identityHashCode=2041416495 
    reified=false) 

月2日更新

我使用兩個服務定位器:一個創建明確地,並通過HK2居民生成器填充;和澤西創造的那個。他們通過BridgingInjectionResolver加入。

@ peeskillet的響應工作,當我添加顯式綁定澤西島的服務定位器。將綁定添加到其他服務定位器導致上述(sessionManagerProvider.get()返回null)。

+0

不知道究竟在何處正在執行的橋接,但如果你只是使用發電機通過本次會發生什麼直奔['GrizzlyHttpServerFactory.createHttpServer(URL,resourceConfig,定位器)'](https://開頭jersey.java.net/apidocs/2.18/jersey/index.html?組織/ GlassFish中/汗布/ grizzly2 /的httpserver/GrizzlyHttpServerFactory.html)?或者你正在做什麼? –

回答

0

它應該工作,如果你也使用javax.inject.Provider<SessionMananger>。默認範圍是每次查找。但我想你需要延遲加載它。

不知道它在功能上與澤西島的RequestScoped有什麼不同。我認爲在PerLookup作用域中,如果我將其注入一次過濾器並一次注入資源類,但即使僅在PerLookup範圍內進行測試,它也會創建兩次,但對於每個請求,仍然只創建一次。

或者,可以肯定的是,如果這真的是你想要的,你可能只想將它綁定到RequestScoped

register(new AbstractBinder(){ 
    protected void configure() { 
     bind(SessionManager.class).to(SessionManager.class) 
            .in(RequestScoped.class); 
    } 
}); 
+0

感謝您的回覆,但我一定在做錯事。我已經更新了這個問題,也許這有助於進一步深入? – Hank

+0

就像我說的我測試它,它工作正常。除了進行我提到的更改之外,上面顯示的任何內容都與我使用的不同。也許這是你沒有展示的東西,比如你如何創建應用程序和服務器。我不知道。不能說我無法重現的東西 –