Guice: введение перехватчиков в ServletModule - PullRequest
2 голосов
/ 03 января 2012

Я пытаюсь ввести Interceptor с помощью экземпляра приложения Vaadin, созданного Guice.Я следовал документации по интеграции Vaadin-Guice в Vaadin Wiki и документации по Interceptor DI в 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);
    }
}

Перехватчик 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)

1 Ответ

3 голосов
/ 03 января 2012

Работает ли это, если вы оберните Application в Provider?

public class SecurityGuard implements MethodInterceptor {
    @Inject private Provider<Application> application;

    public Object invoke(MethodInvocation invocation) throws Throwable {
       AllowedRoles allowedRoles = invocation.getMethod().getAnnotation(AllowedRoles.class);
        if (((User) application.get().getUser()).hasRole(allowedRoles.value())) {
            return invocation.proceed(); 
        } else {
            return null;
        }
}
...