`@Inject` 在 Guice + Jersey2 中的 AuthFilter 不起作用。

huangapple 未分类评论49阅读模式
英文:

@Inject not working for AuthFilter in Guice + Jersey2

问题

我正在尝试使用Guice将依赖项注入到我的自定义AuthFilter中,该AuthFilter实现了ContainerRequestFilter接口。
我的目标是创建一个应用于特定资源的AuthenticationFilter。@Inject在资源类方面运行良好,但在AuthFilter类方面不起作用。

认证过滤器如下所示:

public class MyApiAuthFilter implements ContainerRequestFilter {
    @Inject
    private InjectableResource injectableresource;
    @Override
    public void filter(ContainerRequestContext request) {
        // 过滤逻辑
    }
}

这是我注册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 已检测到以下警告:
警告:检测到未知的HK2故障:
MultiException stack 1 of 3
org.glassfish.hk2.api.UnsatisfiedDependencyException:在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中也能工作?

英文:

I'm attempting to use Guice to inject dependencies into my custom AuthFilter which implements ContainerRequestFilter.
My aim is to have an AuthenticationFilter that is applied to specific Resource. @Inject is working fine for the Resource classes but not for the Authfilter class.

Authetication Filter looks like

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

This is how I register the authfilter and guice-hk2 bridge

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 is an implementation class for InjectableResourceInterface. I have annotated InjectableResourceInterface with @ImplementedBy annotation.

I am getting startup error. Error log:

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)

Any workaround so that @Inject also works for the AuthFilter?

huangapple
  • 本文由 发表于 2020年5月4日 22:07:04
  • 转载请务必保留本文链接:https://java.coder-hub.com/61594170.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定