¿Puedo acceder a los beans de sesión con ámbito de primavera a partir de granos de ámbito de aplicación? ¿Cómo?

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

Pregunta

Estoy tratando de hacer que esta aplicación de 2 jugadores juego en Internet utilizando Spring MVC. Tengo beans de sesión con ámbito de Player y GameList frijol de ámbito de aplicación, lo que crea y almacena Game casos y los pasa al Players. En el jugador crea un juego y obtiene su ID de GameList y otro jugador envía ID para GameList y obtiene ejemplo Game. La instancia Game tiene sus jugadores como atributos. El problema es que cada jugador sólo ve a sí mismo en lugar de la otra.

Ejemplo de lo que ve cada jugador:

  1. El primer jugador (Alice) crea un juego: Creator: Alice, Joiner: Empty
  2. En segundo jugador (Bob) se une al juego: Creator: Bob, Joiner: Bob
  3. El primer jugador refresca su navegador Creator: Alice, Joiner: Alice

Lo que yo quiero que vean es Creator: Alice, Joiner: Bob. Una forma sencilla de lograr esto es guardar información sobre los jugadores en vez de referencias a los jugadores, pero las necesidades de objetos juego para llamar a métodos en sus objetos jugador, así que esto no es una solución.

Creo que es debido a aop:scoped-proxy de frijol jugador de ámbito de sesión. Si entiendo esto, el objeto del juego hace referencia a proxy, que se refiere al objeto jugador de la sesión actual. Can Juego ejemplo guardar / acceder al otro jugador objetos de alguna manera?

frijoles en despachador-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>

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

llamados métodos en 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;
}
¿Fue útil?

Solución

Creo que tiene razón sobre el ser apoderado por qué sólo se ve a sí mismo. Cualquier referencia al proxy se aplicará a sólo el objeto en la sesión.

Qué se necesita para tener el juego y como jugador sesión en ámbito? El hecho que usted está tratando de usarlas sesiones a través indica que no son datos de la sesión de ámbito. Se podía crearlos desde una fábrica y almacenar sus referencias en un bean de sesión con ámbito.

Como alternativa, si no desea que el jugador para ser sesión en ámbito, se podría envolver una referencia a un prototipo en un bean de sesión. A continuación, puede utilizar la referencia prototipo de datos de la sesión de la Cruz, y el bean de sesión para cualquier local de datos sesión específica.

Hay varias maneras de resolver esto, pero, en esencia, lo que necesita para mover los datos de la sesión cruzados fuera de la sesión en ámbito granos y frijol en un ámbito de aplicación que puede ser compartido.

Otros consejos

No se puede acceder a diferentes beans de sesión con ámbito de aplicación ámbito de aplicación.

Sin embargo, se puede hacer a la inversa - registrar cada jugador en el grano de ámbito de aplicación, (llamando addPlayer(..))

No se puede tener los datos del juego en una sesión HTTP, ya que pertenece a un solo usuario.

Es necesario almacenar una referencia al juego, tanto en el creador de la sesión y de la carpintería.

Sí, y la manera más fácil es crear el proxy con la siguiente anotación:

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

Disponible a partir de la primavera 3,1. En los viejos tiempos se tenía que utilizar el AOP: de ámbito proxy etiqueta en XML de configuración

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top