Session ApacheWicket:在会话中注入依赖项(使用GUI)

Session ApacheWicket:在会话中注入依赖项(使用GUI),session,wicket,guice,Session,Wicket,Guice,我使用的是,我遇到了与的OP相同的问题 我需要访问中的DB服务层(用于用户身份验证)。我遵循并做了以下工作: @Override public Session newSession(Request request, Response response) { Session s = new MySession(request); mInjector.inject(s); return s; } 不幸的是,这导致了 java.lang.IllegalStateExcepti

我使用的是,我遇到了与的OP相同的问题

我需要访问中的DB服务层(用于用户身份验证)。我遵循并做了以下工作:

@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().Injector(this)
,似乎不是一个好主意

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

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

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

应用程序#init()
中使用
getRequestCycleListener()注册你的
IRequestCycleListener
。添加(新的YourRequestCycleListener())

你使用了
无状态的
bean吗?这不是Spring吗?(我在用guice)啊,谢谢你。这正是我想要的。关于最后一部分。我阅读了下面的“wicket guice项目将负责代理注入的bean,以便可以安全地序列化页面。”()。这是否意味着我不需要担心分离服务?你是对的,你得到的只是一些可序列化的代理。我将从我的答案中删除这一部分。再次感谢你的回答。我发布了一个后续问题。