Guice:在 ServletModule 中注入拦截器
我正在尝试使用 Guice 创建的 Vaadin 应用程序实例注入拦截器。 我已按照 Vaadin 维基 和 Guice Wiki 中有关 Interceptor DI 的文档:
public class RecruitmentServletConfig extends GuiceServletContextListener {
@Override
protected Injector getInjector() {
ServletModule servletModule = new ServletModule() {
@Override
protected void configureServlets() {
...
bind(Application.class).to(RecruitmentApplication.class).in(ServletScopes.SESSION);
SecurityGuard securityGuard = new SecurityGuard();
requestInjection(securityGuard);
bindInterceptor(Matchers.subclassesOf(CustomComponent.class), Matchers.annotatedWith(AllowedRoles.class), securityGuard);
}
};
return Guice.createInjector(servletModule);
}
}
SecurityGuard 拦截器:
public class SecurityGuard implements MethodInterceptor {
@Inject private Application application;
public Object invoke(MethodInvocation invocation) throws Throwable {
AllowedRoles allowedRoles = invocation.getMethod().getAnnotation(AllowedRoles.class);
if (((User) application.getUser()).hasRole(allowedRoles.value())) {
return invocation.proceed();
} else {
return null;
}
}
但是,我在服务器启动时收到 OutOfScopeException:
SEVERE: Exception sending context initialized event to listener instance of class de.embl.eicat.recruit.ioc.RecruitmentServletConfig
com.google.inject.CreationException: Guice creation errors:
1) Error in custom provider, com.google.inject.OutOfScopeException: Cannot access scoped object. Either we are not currently inside an HTTP Servlet request, or you may have forgotten to apply com.google.inject.servlet.GuiceFilter as a servlet filter for this request.
at recruit.ioc.RecruitmentServletConfig$1.configureServlets(RecruitmentServletConfig.java:86)
I am trying to inject an Interceptor with a Vaadin Application instance created by Guice.
I've followed the documentation for Vaadin-Guice integration in the Vaadin Wiki and
the documenation on Interceptor DI in the Guice Wiki:
public class RecruitmentServletConfig extends GuiceServletContextListener {
@Override
protected Injector getInjector() {
ServletModule servletModule = new ServletModule() {
@Override
protected void configureServlets() {
...
bind(Application.class).to(RecruitmentApplication.class).in(ServletScopes.SESSION);
SecurityGuard securityGuard = new SecurityGuard();
requestInjection(securityGuard);
bindInterceptor(Matchers.subclassesOf(CustomComponent.class), Matchers.annotatedWith(AllowedRoles.class), securityGuard);
}
};
return Guice.createInjector(servletModule);
}
}
The SecurityGuard interceptor:
public class SecurityGuard implements MethodInterceptor {
@Inject private Application application;
public Object invoke(MethodInvocation invocation) throws Throwable {
AllowedRoles allowedRoles = invocation.getMethod().getAnnotation(AllowedRoles.class);
if (((User) application.getUser()).hasRole(allowedRoles.value())) {
return invocation.proceed();
} else {
return null;
}
}
However, I get an OutOfScopeException on server startup:
SEVERE: Exception sending context initialized event to listener instance of class de.embl.eicat.recruit.ioc.RecruitmentServletConfig
com.google.inject.CreationException: Guice creation errors:
1) Error in custom provider, com.google.inject.OutOfScopeException: Cannot access scoped object. Either we are not currently inside an HTTP Servlet request, or you may have forgotten to apply com.google.inject.servlet.GuiceFilter as a servlet filter for this request.
at recruit.ioc.RecruitmentServletConfig$1.configureServlets(RecruitmentServletConfig.java:86)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
如果将
Application
包装在Provider
中,它可以工作吗?Does it work if you wrap your
Application
in aProvider
?