英文:
@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?
专注分享java语言的经验与见解,让所有开发者获益!
评论