アプリケーションスコープ付きの豆から春のセッションスコープ豆にアクセスできますか?どのように?

StackOverflow https://stackoverflow.com/questions/2897299

質問

Spring MVCを使用して、この2プレイヤーWebゲームアプリケーションを作成しようとしています。セッションスコープ豆があります Player およびアプリケーションスコープ付きビーン GameList, 、作成して保存します Game インスタンスと渡されます Players. 。プレイヤーがゲームを作成し、からIDを取得します GameList 他のプレイヤーはIDを送信します GameList と取得します Game 実例。 Game インスタンスには、プレーヤーが属性としてあります。問題は、各プレイヤーが他のプレイヤーの代わりに自分自身だけを見ることです。

各プレイヤーが見るものの例:

  1. ファーストプレーヤー(アリス)がゲームを作成します。 Creator: Alice, Joiner: Empty
  2. セカンドプレーヤー(ボブ)がゲームに参加します: Creator: Bob, Joiner: Bob
  3. ファーストプレーヤーはブラウザを更新します Creator: Alice, Joiner: Alice

私が彼らに見たいのはです Creator: Alice, Joiner: Bob. 。これを達成する簡単な方法は、プレイヤーへの参照ではなくプレイヤーに関する情報を保存することですが、ゲームオブジェクトはプレイヤーオブジェクトのメソッドを呼び出す必要があるため、これは解決策ではありません。

おかげだと思います aop:scoped-proxy セッションスコーププレーヤーBeanの。これを理解していれば、ゲームオブジェクトにはプロキシを参照します。これは、現在のセッションのプレーヤーオブジェクトを指します。ゲームインスタンスは、他のプレーヤーオブジェクトをどうにか保存/アクセスできますか?

Dispatcher-servlet.xml:

<bean id="userDao" class="authorization.UserDaoFakeImpl"  />
<bean id="gameList" class="model.GameList" />
<bean name="/init/*" class="controller.InitController" >
     <property name="gameList" ref="gameList" />
     <property name="game" ref="game" />
     <property name="player" ref="player" />
</bean>
<bean id="game" class="model.GameContainer" scope="session">
      <aop:scoped-proxy/>
</bean>
<bean id="player" class="beans.Player" scope="session">
      <aop:scoped-proxy/>
</bean>

メソッドの controller.initcontroller

private GameList gameList;
private GameContainer game;
private Player player;
public ModelAndView create(HttpServletRequest request,
        HttpServletResponse response) throws Exception {        
    game.setGame(gameList.create(player));        
    return new ModelAndView("redirect:game");
}
public ModelAndView join(HttpServletRequest request,
        HttpServletResponse response, GameId gameId) throws Exception {
    game.setGame(gameList.join(player, gameId.getId()));       
    return new ModelAndView("redirect:game");
}

メソッドと呼ばれます Model.Gamelist

public Game create(Player creator) {        
    Integer code = generateCode();        
    Game game = new Game(creator, code);
    games.put(code, game);
    return game;
}
public Game join(Player joiner, Integer code) {
    Game game = games.get(code);
    if (game!=null) {
        game.setJoiner(joiner);           
    }
    return game;
}
役に立ちましたか?

解決

私はあなたが自分自身だけを見る理由であるという代理についてあなたが正しいと信じています。プロキシへの参照は、セッション内のオブジェクトのみに適用されます。

セッションとしてゲームとプレーヤーをスコープする必要がありますか?セッション全体でそれらを使用しようとしているという事実は、セッションスコープデータではないことを示しています。工場からそれらを作成し、セッションスコープ付きBeanに参照を保存することができます。

または、プレーヤーをセッションスコープにしたい場合は、セッションBeanのプロトタイプへの参照をラップすることができます。その後、クロスセッションデータにプロトタイプリファレンスを使用し、セッション固有のローカルデータにセッションBeanを使用できます。

これを解決するにはいくつかの方法がありますが、本質的に、クロスセッションデータをセッションスコープ付き豆から、共有できるアプリケーションスコープビーンに移動する必要があります。

他のヒント

アプリケーションスコープからさまざまなセッションスコープ豆にアクセスすることはできません。

ただし、他の方法で実行できます - アプリケーションスコープ付きBeanに各プレーヤーを登録することができます(電話して addPlayer(..))

HTTPセッションでゲームデータを入手することはできません。これは、1人のユーザーのみに属しているためです。

クリエイターとジョイナーのセッションの両方で、ゲームへの参照を保存する必要があります。

はい、そして最も簡単な方法は、次の注釈でプロキシを作成することです。

@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)

春3.1から入手可能。昔は、XML構成でAOP:Scoped-Proxyタグを使用する必要がありました

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top