Могу ли я получить доступ к весенне-сессионным бобам из фасолей на уровне приложений? Как?
-
04-10-2019 - |
Вопрос
Я пытаюсь сделать это 2-игровое веб-игр, используя весну MVC. У меня есть бобы Player
и приложение-населенный боб GameList
, который создает и хранит Game
экземпляры и передают их Players
. Отказ На игроке создает игру и получает свой идентификатор от GameList
и другой игрок отправляет удостоверение личности GameList
и получает Game
пример. То Game
Экземпляр имеет свои игроки как атрибуты. Проблема в том, что каждый игрок видит только сам вместо другого.
Пример того, что каждый игрок видит:
- Первый игрок (Алиса) создает игру:
Creator: Alice, Joiner: Empty
- Второй игрок (Боб) присоединяется к игре:
Creator: Bob, Joiner: Bob
- Первый игрок освежает свой браузер
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