ContainerRequestFilter,每个请求不注入per-lookup-injectable

时间:2015-09-15 15:42:14

标签: java dependency-injection jersey hk2

我在独立的Grizzly网络服务器上使用Jersey 2。 HK2用于CDI。我希望获得@PerLookup的服务 - 将范围注入球衣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
    loader=org.glassfish.hk2.utilities.binding.AbstractBinder$2@78b729e6
    proxiable=null
    proxyForSameScope=null
    analysisName=null
    id=39
    locatorId=0
    identityHashCode=2041416495
    reified=false)

第二次更新

我正在使用两个服务定位器:一个明确创建,并通过HK2居民生成器填充;和泽西创造的那个。它们通过BridgingInjectionResolver加入。

当我向泽西岛的服务定位器添加显式绑定时,

@peeskillet的响应有效。将绑定添加到其他服务定位器会导致上述(sessionManagerProvider.get()返回null)。

1 个答案:

答案 0 :(得分:0)

如果你也使用javax.inject.Provider<SessionMananger>,它应该有效。默认范围是每次查找。但我想你需要懒洋洋地加载它。

不确定它与泽西岛RequestScoped的功能有何不同。我认为在PerLookup范围内,如果我将其一次注入过滤器并且一次注入资源类,它将被创建两次,但是现在只是测试,即使在PerLookup范围内,它仍然是仅为每个请求创建一次。

或者,只是为了确定,您可能只想将其绑定在RequestScoped中,如果这是您真正想要的。

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