Frage

Ich versuche, diese 2-Spieler-Web-Spiel-Anwendung mit Spring MVC zu machen. Ich habe session-scoped Bohnen Player und applikations scoped Bohne GameList, die erzeugt und speichert Game Instanzen und übergibt sie an Players. Auf Spieler erstellt ein Spiel und bekommt seine ID aus GameList und anderen Spielern senden ID GameList und bekommen Game Instanz. Die Game Instanz hat seine Spieler als Attribut. Das Problem ist, dass jeder Spieler sieht nur sich selbst, anstatt die andere.

Beispiel von dem, was jeder Spieler sieht:

  1. Der erste Spieler (Alice) erstellt ein Spiel: Creator: Alice, Joiner: Empty
  2. Zweiter Spieler (Bob) schließt sich das Spiel: Creator: Bob, Joiner: Bob
  3. Die erste Spieler frischt ihren Browser Creator: Alice, Joiner: Alice

Was ich sie will, ist sehen Creator: Alice, Joiner: Bob. Einfache Möglichkeit, dies zu erreichen, ist Information Speichern anstelle von Verweisen auf die Spieler über die Spieler, aber die Spielobjekt Bedürfnisse Methoden auf seine Spielerobjekte zu nennen, so dass dies keine Lösung ist.

Ich denke, es ist wegen der aop:scoped-proxy der sitzungs scoped Spieler Bohne. Wenn ich das verstehen, muss das Spiel Objektverweis auf Proxy, die Player-Objekt der aktuellen Sitzung bezieht. Can Spiel Instanz speichern / Zugang die anderen Spieler Objekte irgendwie?

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

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

aufgerufenen Methoden 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;
}
War es hilfreich?

Lösung

Ich glaube, Sie über den Proxy-Sein Recht, warum Sie nur sich selbst zu sehen. Jede Bezugnahme auf den Proxy gilt nur auf das Objekt in der Sitzung.

Haben Sie das Spiel haben brauchen und Spieler als Session-scoped? Die Tatsache dass Sie versuchen, sie zu benutzen, über mehrere Sitzungen hinweg zeigt dass sie nicht Sitzungs-Zielbereichsdaten. Man konnte sie nur von einer Fabrik erstellen und speichern ihre Referenzen in einer Sitzung scoped Bohne.

Alternativ, wenn Sie den Player nicht mögen, werden Sitzungs-Zielbereich, könnten Sie einen Verweis auf einen Prototyp in einem Session-Bean wickeln. Anschließend können Sie den Prototyp Referenz für Ihre Cross Sitzungsdaten verwenden und die Session-Bean für jede Sitzung spezifischen lokalen Daten.

Es gibt mehr Möglichkeiten, dieses Problem zu beheben, aber im Grunde müssen Sie Ihre Quersitzungsdaten aus der Session Beans scoped bewegen und in eine Anwendungsbereich Bohne, die gemeinsam genutzt werden kann.

Andere Tipps

Sie können nicht darauf zugreifen verschiedene Session-scoped Bohnen aus anwendungs ??Umfang.

Allerdings könnten Sie die andere Art und Weise tun, um - registrieren jeden Spieler in der Anwendung-scoped Bohne, (durch den Aufruf addPlayer(..))

Sie können die Spieldaten in einer HTTP-Sitzung haben, denn das ist nur ein Benutzer gehört.

Sie müssen einen Verweis auf das Spiel speichern, sowohl in dem Schöpfer und die Sitzung des Tischlers.

Ja, und der einfachste Weg ist, den Proxy mit folgenden Anmerkung zu erstellen:

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

Erhältlich ab Frühjahr 3.1. In den alten Zeiten hatte man das AOP verwenden: scoped-Proxy-Tag im XML-Konfiguration

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top