Apache Wicket:在Session中注入依赖项(使用Guice)

时间:2013-06-22 20:04:31

标签: session wicket guice

我正在使用Wicket Auth/Roles,我遇到了与this thread的OP相同的问题。

我需要访问AuthenticatedWebSession中的数据库服务层(用于用户身份验证)。我跟着Steve Flasby's suggestion并执行了以下操作:

@Override
public Session newSession(Request request, Response response) {
    Session s = new MySession(request);
    mInjector.inject(s);
    return s;
}

不幸的是,这会导致

java.lang.IllegalStateException: EntityManager is closed

(可能是因为(a)我在视图中使用开放会话,以及(b)会话跨越多个请求)。

我通过将注入移动到AuthenticatedWebSession.authenticate方法来解决这个问题。

@Override
public boolean authenticate(String username, String pass) {

    Injector.get().inject(this);

    ...
}

我怀疑这不是最佳做法,因为现在我也需要在其他方法中访问服务层,并且在每个这样的方法中添加Injector.get().inject(this)似乎不是一个好主意。< / p>

我的问题:

如何在每次请求时对会话对象执行注入? (或者,如果这是一个糟糕的方法,我如何访问AuthenticatedWebSession中的服务层?)

1 个答案:

答案 0 :(得分:5)

您可以实施IRequestCycleListener(扩展AbstractRequestCycleListener)并实施:

@Override
public void onBeginRequest(RequestCycle cycle)
{
        if (Session.exists()) {
            Injector.get().inject(Session.get());
        }
}

使用IRequestCycleListenerApplication#init()注册getRequestCycleListeners().add(new YourRequestCycleListener())