Я делаю веб-сервис для игры с использованием Spring и MongoDB. Одна из особенностей заключается в том, что каждый день игроки могут проголосовать за другого игрока, чтобы убить. В конце дня голоса подсчитываются, и игрок с большинством голосов убит. Вот код для убийства наиболее проголосовала-для игрока (в большей метод называется endDay()
):Spring MongoDB Непоследовательная проблема сохранения
//mostVotes is the player's id in the database.
//Player is just a transient domain object
//playerDAO is a custom DAO that interfaces with MongoDB (see below)
Player accused = playerDAO.getPlayerByID(mostVotes);
logger.info(accused.getIsDead()); //This is false
doKill(accused);
logger.info(playerDAO.getPlayerByID(mostVotes).getIsDead()); //This is true
Вот getPlayerByID():
//mongoTemplate is a MongoOperations object
public Player getPlayerByID(String id) throws NoPlayerFoundException {
Player p = mongoTemplate.findById(id, Player.class);
if (p == null) {
throw new NoPlayerFoundException(id);
}
return p;
}
И doKill():
private void doKill(Player p) {
p.setIsDead(true);
playerDAO.updatePlayer(p);
}
И updatePlayer():
public void updatePlayer(Player p) {
mongoTemplate.save(p);
}
Как вы можете видеть, когда я спрашиваю статус игрока сразу после его убийства (в endDay()
), он, кажется, мертв, чего мы хотим.
Теперь я делаю запрос /player/id
, где id
является идентификатором игрока. Это возвращает мне JSON-кодировку полученного объекта Player (с использованием того же getPlayerByID()
, что и выше). Если я сделаю этот запрос с идентификатором мертвого игрока, он вернется как живой.
Дальнейшее усложнение этого заключается в том, что другие обновления проходят через тонкие запросы. Например, некоторые игроки могут убивать других игроков без голосования. Это убийство использует то же самое Player
, getPlayerByID()
, doKill()
и updatePlayer()
, а мертвая жертва сохраняется.
В настоящее время я запускаю это на сервере Tomcat v7.0 на localhost.
Вы также можете посмотреть прямо на источник, если вы так склонны: [link] (https://github.com/err1100/Werewolf). – err1100