Java Guice+;泽西岛2号&x2B;ContainerRequestFilter和@Context

Java Guice+;泽西岛2号&x2B;ContainerRequestFilter和@Context,java,jersey,guice,jersey-2.0,dropwizard,Java,Jersey,Guice,Jersey 2.0,Dropwizard,我试图使用Guice将依赖项注入到通过注册的中。我还需要Jersey注入HttpServletRequest,我目前正试图通过@Context来实现这一点。这在Dropwizard应用程序中 我的最终目标是通过DynamicFeature将AuthenticationFilter应用于特定资源。我的AuthenticationFilter有几个必须注入的依赖项,它还需要访问HttpServletRequest才能完成其工作。这是Dropwizard项目的一部分,该模式基于Dropwizard的,

我试图使用Guice将依赖项注入到通过注册的中。我还需要Jersey注入HttpServletRequest,我目前正试图通过@Context来实现这一点。这在Dropwizard应用程序中

我的最终目标是通过DynamicFeature将AuthenticationFilter应用于特定资源。我的AuthenticationFilter有几个必须注入的依赖项,它还需要访问HttpServletRequest才能完成其工作。这是Dropwizard项目的一部分,该模式基于Dropwizard的,但经过修改以支持注入

因此,我的AuthenicationFilter如下所示:

public class AuthFilter implements ContainerRequestFilter {

    @Context
    private HttpServletRequest httpServletRequest;

    @Context
    private HttpServletResponse httpServletResponse;

    @Inject
    private InjectableResource injectableResource;

    public void filter(ContainerRequestContext requestContext) throws IOException {

       // Do Auth
    }
}
public class InjectableAuthDynamicFeature implements DynamicFeature {

    // Have tried multiple methods to register fitlers: using Injector,
    // using Provider and using the normal Class
    @Inject
    private Provider<AuthFilter> authFilterProvider;

    @Inject
    private Injector injector;

    @Override
    public void configure(ResourceInfo resourceInfo, FeatureContext context) {

        // Logic to decide on registering of filter followed by one of the
        // following depending on injection method:

        context.register(AuthFilter.class);
        context.register(this.injector.getInstance(AuthFilter.class);
        context.register(this.authFilterProvider.get());
    }
}
我的动态特征如下所示:

public class AuthFilter implements ContainerRequestFilter {

    @Context
    private HttpServletRequest httpServletRequest;

    @Context
    private HttpServletResponse httpServletResponse;

    @Inject
    private InjectableResource injectableResource;

    public void filter(ContainerRequestContext requestContext) throws IOException {

       // Do Auth
    }
}
public class InjectableAuthDynamicFeature implements DynamicFeature {

    // Have tried multiple methods to register fitlers: using Injector,
    // using Provider and using the normal Class
    @Inject
    private Provider<AuthFilter> authFilterProvider;

    @Inject
    private Injector injector;

    @Override
    public void configure(ResourceInfo resourceInfo, FeatureContext context) {

        // Logic to decide on registering of filter followed by one of the
        // following depending on injection method:

        context.register(AuthFilter.class);
        context.register(this.injector.getInstance(AuthFilter.class);
        context.register(this.authFilterProvider.get());
    }
}
MyResource包含@Context成员和@Inject成员这两个@Context/@Inject成员在运行时都被正确填充。因此,出于某种原因,资源注册和过滤器注册/管理的行为有所不同


如有任何想法/见解,将不胜感激

我想我可以给你一个答案

您是否正在使用@Provider注释注册dynamicFeature

我相信这里可能发生的事情是,HK2会在您设置Guice-HK2桥之前尝试注册您的DynamicFeature(以及您的过滤器)

为了解决这个问题,我会尝试手动注册您的功能, 并从功能/过滤器类中删除@Provider注释

i、 e

如果它真的有效,我会在以后更新它

--编辑-- 我完全错了 无法在ContainerRequestFilter中查看GUI依赖项的原因是因为GuiceScope类的可见性是本地的

这基本上意味着只有父serviceLocator能够正确地服务guice依赖项。ContainerRequestFilter/Mapper/Features都是由子ServiceLocator创建的,因此无权解析GuiceScope上下文

为了解决这个问题,我分叉了hk2 guice桥并重写了GuiceScope以使用visibility NORMAL

以下是代码的链接:


我不知道为什么没有人遇到这个问题,但它似乎没有什么好的理由限制了guice桥

同样的问题-你找到办法了吗?我也有同样的问题。最后,我在过滤器中使用了@Context注释。添加了@Visibility(DescriptorVisibility.LOCAL)的commit表示“所有其他上下文都是本地的,以避免子定位器内存泄漏”。也许这只是这座桥的局限性。