ContainerRequestFilter with per-lookup-injectable not injected per request
ContainerRequestFilter with per-lookup-injectable not injected per request
我在独立的 Grizzly 网络服务器上使用 Jersey 2。 HK2 用于 CDI。我想获得一项将 @PerLookup
-scope 注入球衣 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()
returns 无效。
hk2 serviceLocator 是通过 inhabitant-generator 填充的。它报告:
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
loader=org.glassfish.hk2.utilities.binding.AbstractBinder@78b729e6
proxiable=null
proxyForSameScope=null
analysisName=null
id=39
locatorId=0
identityHashCode=2041416495
reified=false)
第二次更新
我正在使用两个服务定位器:一个是明确创建的,并通过 HK2 居民生成器填充;另一个是以及 Jersey 创建的那个。他们通过 .
连接
@peeskillet 的响应有效,当我将显式绑定添加到 Jersey 的服务定位器时。将绑定添加到其他服务定位器会导致上述结果 (sessionManagerProvider.get()
returns null).
如果您也使用 javax.inject.Provider<SessionMananger>
,它应该可以工作。默认范围是每个查找。但我想你需要延迟加载它。
不确定它在功能上与泽西岛的 RequestScoped
有何不同。我认为在 PerLookup
范围内,如果我将它一次注入过滤器,一次注入资源 class,它会被创建两次,但现在只是测试,即使在 PerLookup
范围内,它仍然只为每个请求创建一次。
或者,只是为了确定,您可能只想将它绑定在 RequestScoped
中,如果那是您真正想要的。
register(new AbstractBinder(){
protected void configure() {
bind(SessionManager.class).to(SessionManager.class)
.in(RequestScoped.class);
}
});
我在独立的 Grizzly 网络服务器上使用 Jersey 2。 HK2 用于 CDI。我想获得一项将 @PerLookup
-scope 注入球衣 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()
returns 无效。
hk2 serviceLocator 是通过 inhabitant-generator 填充的。它报告:
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
loader=org.glassfish.hk2.utilities.binding.AbstractBinder@78b729e6
proxiable=null
proxyForSameScope=null
analysisName=null
id=39
locatorId=0
identityHashCode=2041416495
reified=false)
第二次更新
我正在使用两个服务定位器:一个是明确创建的,并通过 HK2 居民生成器填充;另一个是以及 Jersey 创建的那个。他们通过
@peeskillet 的响应有效,当我将显式绑定添加到 Jersey 的服务定位器时。将绑定添加到其他服务定位器会导致上述结果 (sessionManagerProvider.get()
returns null).
如果您也使用 javax.inject.Provider<SessionMananger>
,它应该可以工作。默认范围是每个查找。但我想你需要延迟加载它。
不确定它在功能上与泽西岛的 RequestScoped
有何不同。我认为在 PerLookup
范围内,如果我将它一次注入过滤器,一次注入资源 class,它会被创建两次,但现在只是测试,即使在 PerLookup
范围内,它仍然只为每个请求创建一次。
或者,只是为了确定,您可能只想将它绑定在 RequestScoped
中,如果那是您真正想要的。
register(new AbstractBinder(){
protected void configure() {
bind(SessionManager.class).to(SessionManager.class)
.in(RequestScoped.class);
}
});