【问题标题】:Spring MVC: session beans from two different sessionsSpring MVC:来自两个不同会话的会话 bean
【发布时间】:2011-11-01 03:07:32
【问题描述】:

我面临的问题的一个(简化)版本如下,在 Spring MVC 应用程序中:

两个玩家可以在一场比赛中竞争。这个游戏包括从相同的数据(例如某个棋子位置)开始,分开玩游戏(但同时!),然后比较结果。为了管理这个,我有:

  • 处理游戏的对象(例如,检查玩家是否准备就绪、生成开始数据、检查游戏是否结束……)。为了便于参考,我们将其称为“GameHandler”。
  • 对于每个玩家,处理游戏动作(例如在棋盘上移动棋子)的对象。这是一个会话范围的 bean,因为它包含特定于玩家的状态信息。将其称为“PlayerHandler”:

问题在于 GameHandler 需要对两个 PlayerHandler 的引用。但是,由于这是一个代理会话范围的 bean,因此这些引用指向同一个 bean,具体取决于我用来访问它的会话。例如。两名球员,“汤姆”和“杰瑞”:

会话 Tom:playerHandler.getGameHandler().getPlayer1().getName()playerHandler.getGameHandler().getPlayer2().getName() 都是 Tom Session Jerry:两人都是Jerry。

现在,据我了解,这是预期的行为。我的问题是不是“为什么会这样”,而是“我该如何解决这个问题”。我发现自己的一个解决方案是在 GameHandler 中设置引用时引用实际的 bean,而不是代理:

public void setPlayerOne(PlayerHandler playerHandler) {
try {
        while (playerHandler instanceof Advised)
            playerHandler = (PlayerHandler ) ((Advised) playerHandler ).getTargetSource().getTarget();
    } catch (Exception e) {
        e.printStackTrace();
}
...

但是,我不确定这是最好的解决方案。所以我正在寻找一些答案:我的设计错了吗?如果错了,你会如何设计这个?我错过了一个简单的解决方案吗?这是 Spring 的限制吗?

【问题讨论】:

  • 一次只能进行一场比赛,还是可以让多对玩家玩不同的比赛?
  • @bkent314 多对必须是可能的。

标签: java spring session spring-mvc


【解决方案1】:

回到你的基本设计,你必须重新考虑你的“PlayerHandler”是否真的是会话范围的,从概念上讲。由于您需要在给定会话(处理特定会话请求的线程)范围之外访问它,因此看起来不是。

重构它的一种方法是将“PlayerHandler”移出应用程序范围。例如,创建一个全局单例 bean,可能将其称为“PlayerHandlerHolder”,其中包含一个保存以会话 ID 为键的 PlayerHandler 实例的映射。为防止无限填充此地图,您可以实现一个会话侦听器,在会话销毁时从地图中删除 PlayerHandler 实例。

【讨论】:

    【解决方案2】:

    解决您的问题的一种方法是create a custom scope,称之为“游戏”。现在像这样定义你的bean:

    <bean id="playerHandler" class="snip.PlayerHandler" scope="game">
    <aop:scoped-proxy /></bean>
    

    【讨论】:

    • 但是,我如何区分这两个 bean?当在为我的自定义范围 (GameScope) 实现范围的类上调用 public Object get(String name, ObjectFactory&lt;?&gt; objectFactory) 方法时,我无法区分这两个实例 - name 对于两个 bean 都是相同的,“scopedTarget.playerHandler”。
    • @Jens 我并不是说这是您需要更改的设计的唯一部分。也许范围代理方法根本不起作用。但由于您显然需要请求、会话和应用程序之间的范围,所以我只是提供一个想法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多