アプリケーションスコープ付きの豆から春のセッションスコープ豆にアクセスできますか?どのように?
-
04-10-2019 - |
質問
Spring MVCを使用して、この2プレイヤーWebゲームアプリケーションを作成しようとしています。セッションスコープ豆があります Player
およびアプリケーションスコープ付きビーン GameList
, 、作成して保存します Game
インスタンスと渡されます Players
. 。プレイヤーがゲームを作成し、からIDを取得します GameList
他のプレイヤーはIDを送信します GameList
と取得します Game
実例。 Game
インスタンスには、プレーヤーが属性としてあります。問題は、各プレイヤーが他のプレイヤーの代わりに自分自身だけを見ることです。
各プレイヤーが見るものの例:
- ファーストプレーヤー(アリス)がゲームを作成します。
Creator: Alice, Joiner: Empty
- セカンドプレーヤー(ボブ)がゲームに参加します:
Creator: Bob, Joiner: Bob
- ファーストプレーヤーはブラウザを更新します
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タグを使用する必要がありました