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?)
您可以实现IRequestCycleListener(扩展AbstractRequestCycleListener)和实现:
@Override
public void onBeginRequest(RequestCycle cycle)
{
if (Session.exists()) {
Injector.get().inject(Session.get());
}
}
Run Code Online (Sandbox Code Playgroud)
注册您IRequestCycleListener在Application#init()使用getRequestCycleListeners().add(new YourRequestCycleListener()).