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

aio*_*obe 4 session wicket guice

我正在使用Wicket Auth/Roles,我遇到了与此线程的OP相同的问题.

我需要访问AuthenticatedWebSession(用于用户身份验证)的DB服务层.我按照Steve Flasby的建议行事,并做了以下事情:

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

不幸的是,这导致了

java.lang.IllegalStateException: EntityManager is closed
Run Code Online (Sandbox Code Playgroud)

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

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

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

    Injector.get().inject(this);

    ...
}
Run Code Online (Sandbox Code Playgroud)

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

我的问题:

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

Chr*_*ter 5

您可以实现IRequestCycleListener(扩展AbstractRequestCycleListener)和实现:

@Override
public void onBeginRequest(RequestCycle cycle)
{
        if (Session.exists()) {
            Injector.get().inject(Session.get());
        }
}
Run Code Online (Sandbox Code Playgroud)

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