Java Guice+;泽西岛2号&x2B;ContainerRequestFilter和@Context
我试图使用Guice将依赖项注入到通过注册的中。我还需要Jersey注入HttpServletRequest,我目前正试图通过@Context来实现这一点。这在Dropwizard应用程序中 我的最终目标是通过DynamicFeature将AuthenticationFilter应用于特定资源。我的AuthenticationFilter有几个必须注入的依赖项,它还需要访问HttpServletRequest才能完成其工作。这是Dropwizard项目的一部分,该模式基于Dropwizard的,但经过修改以支持注入 因此,我的AuthenicationFilter如下所示: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的,
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表示“所有其他上下文都是本地的,以避免子定位器内存泄漏”。也许这只是这座桥的局限性。