Domanda

Sto cercando di rendere questa applicazione per 2 giocatori web game con Spring MVC. Ho session bean con scope Player e GameList fagioli applicazione con ambito, che crea e memorizza Game istanze e passa al Players. Su giocatore crea un gioco e deve il suo ID dal GameList e l'altro giocatore invia ID per GameList e ottiene esempio Game. L'istanza Game ha i suoi giocatori come attributi. Il problema è che ogni giocatore vede solo se stesso anziché l'altro.

Esempio di ciò che ogni giocatore vede:

  1. Il primo giocatore (Alice) crea un gioco: Creator: Alice, Joiner: Empty
  2. Secondo il giocatore (Bob) entra a far parte del gioco: Creator: Bob, Joiner: Bob
  3. Il primo giocatore aggiorna il suo navigatore Creator: Alice, Joiner: Alice

Quello che voglio loro di vedere è Creator: Alice, Joiner: Bob. Un modo semplice per raggiungere questo obiettivo è salvare le informazioni sui giocatori, invece di riferimenti a giocatori, ma le esigenze di oggetti di gioco per chiamare metodi sui suoi oggetti giocatore, quindi questa non è una soluzione.

Penso che sia a causa della aop:scoped-proxy sessione con ambito di fagioli Player. Se ho capito questo, l'oggetto del gioco ha riferimento al proxy, che si riferisce ad oggetto Player di sessione corrente. Can Gioco esempio Save / accedere agli oggetti l'altro giocatore in qualche modo?

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

metodi in 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");
}

chiamati metodi in 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;
}
È stato utile?

Soluzione

Credo che tu abbia ragione riguardo l'essere procura questo che si vede solo te stesso. Ogni riferimento al proxy si applica al solo l'oggetto nella sessione.

Avete bisogno di avere il gioco e    giocatore come scope di sessione? Il fatto    che si sta tentando di usarli    sessioni tra indica    che non sono scope di sessione di dati. Si potrebbe semplicemente crearli da una fabbrica e memorizzare i loro riferimenti in una session bean ambito.

In alternativa, se si desidera che il giocatore sia con scope di sessione, si potrebbe avvolgere un riferimento a un prototipo in un session bean. È quindi possibile utilizzare il riferimento prototipo per i vostri dati di sessione a croce, e il fagiolo di sessione per ogni sessione specifica dati locali.

Ci sono diversi modi per risolvere questo, ma in sostanza è necessario spostare i dati della sessione trasversali fuori della sessione ambito fagioli e in un ambito di fagioli applicazione che può essere condiviso.

Altri suggerimenti

Non è possibile accedere a diversi session bean con scope dall'applicazione-campo di applicazione.

Tuttavia, si potrebbe fare il contrario - registrare ogni giocatore nel chicco di applicazione con ambito, (chiamando addPlayer(..))

Non è possibile avere i dati di gioco in una sessione HTTP, dal momento che appartiene ad un solo utente.

È necessario memorizzare un riferimento al gioco, sia il creatore e di sessione del falegname.

Sì, e il modo più semplice è quello di creare il proxy con la seguente annotazione:

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

Disponibile dalla primavera 3.1. Nei tempi antichi si doveva usare l'AOP: ambito-proxy tag in XML di configurazione

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top