Java ContainerRequestFilter,每个查找可注入,而不是每个请求注入

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 { [.

我在一个独立的Grizzly Web服务器上使用Jersey 2。HK2用于CDI。我想获得一个带有
@PerLookup
-作用域的服务,该作用域被注入一个jersey
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;

    [...]

}
如果我添加显式绑定,那么也会发现如下所示:

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);
    }
});