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

4
我正在使用 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;
}

很遗憾,这导致了...
java.lang.IllegalStateException: EntityManager is closed

这可能是因为我正在使用开放式会话,并且会话跨越了多个请求。

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

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

    Injector.get().inject(this);

    ...
}

我怀疑这不是最佳实践,因为现在我需要在其他方法中访问服务层,并且在每个这样的方法中添加Injector.get().inject(this)似乎不是一个好主意。
我的问题是:如何在每个请求中对session对象执行注入?(或者,如果总体来说这是一个不好的方法,那么如何在AuthenticatedWebSession中访问服务层?)

你使用过Stateless bean吗? - Dmitry Zagorulkin
这不是Spring的事吗?(我正在使用guice。) - aioobe
1个回答

5
您可以实现 IRequestCycleListener(扩展AbstractRequestCycleListener)并实现以下内容:
@Override
public void onBeginRequest(RequestCycle cycle)
{
        if (Session.exists()) {
            Injector.get().inject(Session.get());
        }
}

Application#init()中使用getRequestCycleListeners().add(new YourRequestCycleListener())注册您的IRequestCycleListener


啊,谢谢。这正是我在寻找的东西。关于最后一部分。我读到了以下内容:“wicket-guice项目将负责代理注入的bean,以便您的页面可以安全地序列化。”(在此处)。这是否意味着我不需要担心分离服务? - aioobe
你说得对,你只能得到一些可序列化的代理。我会从我的回答中删除那部分内容。 - Christoph Leiter
再次感谢您的回答。我在这里发布了一个后续问题(http://stackoverflow.com/questions/17285304/apache-wicket-injecting-dependencies-in-form-validators-using-guice)。 - aioobe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接