4

我正在使用Wicket Auth/Roles并且遇到了与该线程的 OP 相同的问题。

我需要访问数据库服务层AuthenticatedWebSession(用于用户认证)。我按照史蒂夫·弗拉斯比的建议做了以下事情:

@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)我怀疑这不是最佳实践,因为现在我也需要通过其他方法访问服务层,并且在每个这样的方法中添加似乎不是一个好主意。

我的问题:

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

4

1 回答 1

5

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

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

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

于 2013-06-23T09:20:21.120 回答