Могу ли я получить доступ к весенне-сессионным бобам из фасолей на уровне приложений? Как?

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

Вопрос

Я пытаюсь сделать это 2-игровое веб-игр, используя весну MVC. У меня есть бобы Player и приложение-населенный боб GameList, который создает и хранит Game экземпляры и передают их Players. Отказ На игроке создает игру и получает свой идентификатор от GameList и другой игрок отправляет удостоверение личности GameList и получает Game пример. То Game Экземпляр имеет свои игроки как атрибуты. Проблема в том, что каждый игрок видит только сам вместо другого.

Пример того, что каждый игрок видит:

  1. Первый игрок (Алиса) создает игру: Creator: Alice, Joiner: Empty
  2. Второй игрок (Боб) присоединяется к игре: Creator: Bob, Joiner: Bob
  3. Первый игрок освежает свой браузер Creator: Alice, Joiner: Alice

Что я хочу, чтобы они увидели, это Creator: Alice, Joiner: Bob. Отказ Легкий способ достижения этой экономии информации о игроках вместо ссылок на игроков, но объект игры должен вызывать методы на объектах игрока, так что это не решение.

Я думаю, что это из-за aop:scoped-proxy сессионного участка игрока бобов. Если я пойму это, игровой объект имеет ссылку на прокси, который относится к объекту игрока текущей сессии. Можно ли экземпляр игры Сохранить / получить доступ к другим объектам проигрывателя как-то?

бобы внутри 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>

методы внутри Контроллер .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;
}
Это было полезно?

Решение

Я верю, что вы правы в том, что прокси, который вы видите только самостоятельно. Любая ссылка на прокси применяется только к объекту на вашем сеансе.

Вам нужно иметь игру и игрок в качестве сеанса Scoped? Тот факт, что вы пытаетесь использовать их через сеансы, указывают на то, что они не соблюдают данные о выплате. Вы могли бы просто создать их с фабрики и хранить свои ссылки на сеансе Scoped Bean.

В качестве альтернативы, если вы хотите, чтобы игрок был сеансом, вытесненным, вы можете обернуть ссылку на прототип в сессионном бобе. Затем вы можете использовать ссылку на прототипу для данных вашего кросс-сеанса, а также сеансовой боб для любых сеансов определенных местных данных.

Существует несколько способов решить это, но по сути вам нужно переместить данные вашего поперечного сеанса из сеанса Scoped Beans и в боб приложения, которые могут быть переданы.

Другие советы

Вы не можете получить доступ к различным сеансам фасоли из приложения.

Тем не менее, вы могли бы сделать наоборот - зарегистрируйте каждого игрока в Bean-Bean-Scoped приложения, (позвонив addPlayer(..))

Вы не можете иметь данные игры на сеансе HTTP, так как это принадлежит только одному пользователю.

Вам нужно хранить ссылку на игру как в сессии Создателя, так и в заседании.

Да и самый простой способ состоит в том, чтобы создать прокси со следующей аннотацией:

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

Доступно от весны 3.1. В старые времена вам пришлось использовать AOP: Tag Scoped-Proxy в конфигурации XML

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top