首页 > 解决方案 > @Inject 不适用于 Guice + Jersey2 中的 AuthFilter

问题描述

我正在尝试使用 Guice 将依赖项注入到实现 ContainerRequestFilter 的自定义 AuthFilter 中。我的目标是拥有一个应用于特定资源的 AuthenticationFilter。@Inject 适用于 Resource 类,但不适用于 Authfilter 类。

身份验证过滤器看起来像

public class MyApiAuthFilter implements ContainerRequestFilter {
    @Inject
    private InjectableResource injectableresource;
    @Override
    public void filter(ContainerRequestContext request) {
     //Filter Logic
   }
}

这就是我注册 authfilter 和 guice-hk2 网桥的方式

public class MyApplication extends ResourceConfig {

    @Inject
    public MyApplication(ServiceLocator serviceLocator) {
        register(MyApiAuthFilter.class);

        register(new ContainerLifecycleListener() {
            public void onStartup(Container container) {
                ServletContainer servletContainer = (ServletContainer)container;
                GuiceBridge.getGuiceBridge().initializeGuiceBridge(serviceLocator);
                GuiceIntoHK2Bridge guiceBridge = serviceLocator.getService(GuiceIntoHK2Bridge.class);
                Injector injector = (Injector) servletContainer.getServletContext().getAttribute(Injector.class.getName());
                guiceBridge.bridgeGuiceInjector(injector);
            }
            public void onReload(Container container) {

            }
            public void onShutdown(Container container) {
            }
        });

    }

InjectableResource 是 InjectableResourceInterface 的实现类。我用 @ImplementedBy 注释对 InjectableResourceInterface 进行了注释。

我收到启动错误。错误日志:

WARN The following warnings have been detected: WARNING: Unknown HK2 failure detected:
MultiException stack 1 of 3
org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at SystemInjecteeImpl(requiredType=InjectableResource,parent=MyApiAuthFilter,qualifiers={},position=-1,optional=false,self=false,unqualified=null,1601756706)
    at org.jvnet.hk2.internal.ThreeThirtyResolver.resolve(ThreeThirtyResolver.java:75)
    at org.jvnet.hk2.internal.ClazzCreator.resolve(ClazzCreator.java:212)
    at org.jvnet.hk2.internal.ClazzCreator.resolveAllDependencies(ClazzCreator.java:235)
    at org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:358)
    at org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:487)
    at org.jvnet.hk2.internal.SingletonContext$1.compute(SingletonContext.java:83)

任何解决方法使@Inject 也适用于 AuthFilter?

标签: javadependency-injectionguicejersey-2.0hk2

解决方案


推荐阅读