我在獨立的灰熊網絡服務器上使用澤西島2。 HK2用於CDI。我想通過@PerLookup
-scope獲得服務ContainerRequestFilter
。ContainerRequestFilter每個查詢注入不注入每個請求
服務:
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)。
不知道究竟在何處正在執行的橋接,但如果你只是使用發電機通過本次會發生什麼直奔['GrizzlyHttpServerFactory.createHttpServer(URL,resourceConfig,定位器)'](https://開頭jersey.java.net/apidocs/2.18/jersey/index.html?組織/ GlassFish中/汗布/ grizzly2 /的httpserver/GrizzlyHttpServerFactory.html)?或者你正在做什麼? –