【发布时间】:2016-04-11 03:00:42
【问题描述】:
我正在尝试使用 Guice 将依赖项注入通过 DynamicFeature 注册的 ContainerRequestFilter。我还需要 Jersey 来注入 HttpServletRequest,我目前正在尝试通过 @Context 执行此操作。这是在 Dropwizard 应用程序中。
我的最终目标是拥有一个通过 DynamicFeature 应用于特定资源的 AuthenticationFilter。我的 AuthenticationFilter 有一些必须注入的依赖项,它还需要访问 HttpServletRequest 才能完成工作。这是 Dropwizard 项目的一部分,该模式基于 Dropwizard 的 AuthDynamicFeature 和 AuthFilter,但经过修改以支持注入。
所以我的 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
}
}
我的 DynamicFeature 看起来像这样:
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());
}
}
不幸的是,我的 AuthFilter 从未使用我需要的所有依赖项创建/运行。如果我使用 this.injector 或 this.authFilterProvider ,那么我的 @Inject 字段是正确的,而我的 @Context 字段不正确。我的理解是,这是因为我正在注册对象的一个实例,因此 Jersey 无法管理它/注入它的 @Context 字段。但是,当我只是注册课程时,我的 @Context 字段已注册,但我的 @Inject 字段未注册。
我可以做哪些注册/注入过程来确保@Context和@Inject在运行时都被正确填充?
另一条信息可能有用的信息:如果我使用以下行注册资源:
// AKA Dropwizard environment.jersey().register(...);
resourceConfig.register(this.injector.getInstance(MyResource.class));
MyResource 包含@Context 成员和@Inject 成员,@Context/@Inject 成员都在运行时正确填充。因此,由于某种原因,资源注册和过滤器注册/管理的行为不同。
任何想法/见解将不胜感激。
【问题讨论】:
-
同样的问题 - 你找到方法了吗?
标签: java jersey guice jersey-2.0 dropwizard