【问题标题】:ContainerRequestFilter with per-lookup-injectable not injected per requestContainerRequestFilter with per-lookup-injectable 不是每个请求都注入
【发布时间】:2015-09-15 15:42:13
【问题描述】:

我在独立的 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&lt;SessionManager&gt; sessionManagerProvider 的建议方法对我来说合乎逻辑,但 sessionManagerProvider.get() 返回 null。

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$2@78b729e6
    proxiable=null
    proxyForSameScope=null
    analysisName=null
    id=39
    locatorId=0
    identityHashCode=2041416495
    reified=false)

第二次更新

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

@peeskillet 的响应有效,当我将显式绑定添加到 Jersey 的服务定位器时。将绑定添加到其他服务定位器会导致上述结果(sessionManagerProvider.get() 返回 null)。

【问题讨论】:

标签: java dependency-injection jersey hk2


【解决方案1】:

如果您也使用javax.inject.Provider&lt;SessionMananger&gt;,它应该可以工作。默认范围是每次查找。但我想你需要懒惰地加载它。

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

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

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

【讨论】:

  • 感谢您的回复,但我一定是做错了什么。我已经更新了问题,也许这有助于进一步深入研究?
  • 就像我说的,我测试过它,它工作正常。除了进行我提到的更改之外,您在上面显示的任何内容都与我使用的不同。也许这是你没有展示的东西,比如你如何创建应用程序和服务器。我不知道。不能说我不能复制的东西
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-30
  • 2014-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-12
相关资源
最近更新 更多