Java ContainerRequestFilter,每个查找可注入,而不是每个请求注入
我在一个独立的Grizzly Web服务器上使用Jersey 2。HK2用于CDI。我想获得一个带有Java ContainerRequestFilter,每个查找可注入,而不是每个请求注入,java,dependency-injection,jersey,hk2,Java,Dependency Injection,Jersey,Hk2,我在一个独立的Grizzly Web服务器上使用Jersey 2。HK2用于CDI。我想获得一个带有@PerLookup-作用域的服务,该作用域被注入一个jerseyContainerRequestFilter 服务: import org.glassfish.hk2.api.PerLookup; import org.jvnet.hk2.annotations.Service; @Service @PerLookup public class SessionManager { [.
@PerLookup
-作用域的服务,该作用域被注入一个jerseyContainerRequestFilter
服务:
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;
[...]
}
如果我添加显式绑定,那么也会发现如下所示:
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$2@78b729e6
proxiable=null
proxyForSameScope=null
analysisName=null
id=39
locatorId=0
identityHashCode=2041416495
reified=false)
第二次更新
我使用两个服务定位器:一个显式创建,并通过HK2居民生成器填充;泽西创造的那个。它们通过一个连接点连接在一起
@当我将显式绑定添加到Jersey的服务定位器时,peeskillet的响应有效。将绑定添加到其他服务定位器会产生上述结果(
sessionManagerProvider.get()
返回null)。如果同时使用javax.inject.Provider
,它应该可以工作。默认范围为每次查找。但我想你需要懒洋洋地加载它
不确定它在功能上与泽西岛的RequestScoped
有何不同。我认为在PerLookup
范围内,如果我将其一次注入过滤器,一次注入资源类,它将被创建两次,但现在刚刚测试,即使在PerLookup
范围内,它仍然只为每个请求创建一次
或者,可以肯定的是,如果您真正想要的话,您可能只想将其绑定到一个RequestScoped
register(new AbstractBinder(){
protected void configure() {
bind(SessionManager.class).to(SessionManager.class)
.in(RequestScoped.class);
}
});
谢谢你的回复,但我一定是做错了什么。我已经更新了这个问题,也许这有助于进一步深入研究?就像我说的,我测试了它,效果很好。除了我提到的改变之外,你在上面展示的与我使用的没有什么不同。也许这是您没有展示的内容,比如如何创建应用程序和服务器。我不知道。说不出我不能复制的东西不确定你在哪里执行桥接,但是如果你直接用生成器将桥接器传递给服务器会发生什么?或者这就是你目前正在做的事情?
register(new AbstractBinder(){
protected void configure() {
bind(SessionManager.class).to(SessionManager.class)
.in(RequestScoped.class);
}
});