Puis-je avoir accès à des haricots scope session-printemps de haricots portée application? Comment?

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

Question

Je suis en train de faire de cette application de jeu web 2-joueur en utilisant Spring MVC. Je haricots scope séance-Player et GameList de haricot scope application, qui crée et stocke Game les instances et les transmet à Players. Le joueur crée un jeu et obtient son ID de GameList et autre joueur envoie ID à GameList et obtient instance Game. L'instance de Game a ses joueurs comme des attributs. Le problème est que chaque joueur ne voit que lui-même au lieu de l'autre.

Exemple de ce que chaque joueur voit:

  1. Le premier joueur (Alice) crée un jeu: Creator: Alice, Joiner: Empty
  2. deuxième joueur (Bob) rejoint le jeu: Creator: Bob, Joiner: Bob
  3. Le premier joueur de son navigateur Creator: Alice, Joiner: Alice rafraichit

Ce que je veux qu'ils voient est Creator: Alice, Joiner: Bob. Un moyen facile d'y parvenir est d'enregistrer des informations sur les joueurs au lieu de références aux joueurs, mais les besoins de l'objet de jeu pour appeler des méthodes sur ses objets de joueur, donc ce n'est pas une solution.

Je pense qu'il est à cause de aop:scoped-proxy de haricot scope session du joueur. Si je comprends cela, l'objet du jeu a référence à proxy, qui fait référence à l'objet de la session en cours du joueur. Can exemple sauvegarde de jeu / accéder aux autres objets du joueur en quelque sorte?

haricots dans -servlet.xml répartiteur:

<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>

méthodes 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");
}

méthodes appelées 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;
}
Était-ce utile?

La solution

Je crois que vous avez raison de l'être proxy pourquoi vous ne voyez que vous. Toute référence à la procuration s'appliquera uniquement à l'objet de votre session.

Avez-vous besoin d'avoir le jeu et    joueur comme séance scope? Le fait    que vous essayez de les utiliser    sessions à travers indique    qu'ils ne sont pas des données scope de session. Vous pouvez simplement les créer à partir d'une usine et stocker leurs références dans une bean session scope.

Sinon, si vous voulez que le joueur soit la session scope, vous pouvez envelopper une référence à un prototype dans un bean session. Vous pouvez ensuite utiliser la référence prototype pour vos données de session de fond, et la fève de session pour les données locales spécifique de la session.

Il y a plusieurs façons de résoudre ce problème, mais en substance, vous devez déplacer vos données de session de biffer de la session scope haricots et dans un grain de champ d'application qui peut être partagée.

Autres conseils

Vous ne pouvez pas accéder à différents haricots scope séance-de-champ d'application.

Cependant, vous pouvez faire l'inverse - enregistrer chaque joueur dans le haricot scope application, (en appelant addPlayer(..))

Vous ne pouvez pas avoir les données de jeu dans une session HTTP, puisque ce qui appartient à un seul utilisateur.

Vous devez stocker une référence au jeu à la fois et la session du menuisier de créateur.

Oui, et la meilleure façon est de créer le proxy avec l'annotation suivante:

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

Disponible à partir du printemps 3.1. Dans les temps anciens, il fallait utiliser le aop: tag scope-proxy dans la configuration XML

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top