我正在使用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
中的服务层?)
答案 0 :(得分:5)
您可以实施IRequestCycleListener
(扩展AbstractRequestCycleListener
)并实施:
@Override
public void onBeginRequest(RequestCycle cycle)
{
if (Session.exists()) {
Injector.get().inject(Session.get());
}
}
使用IRequestCycleListener
在Application#init()
注册getRequestCycleListeners().add(new YourRequestCycleListener())
。