2013-10-09 2 views
0

Я делаю веб-сервис для игры с использованием 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.

+0

Вы также можете посмотреть прямо на источник, если вы так склонны: [link] (https://github.com/err1100/Werewolf). – err1100

ответ

0

Исправлено! Оказывается, я позже повторил и обновил устаревший список игроков. Так убитый игрок был случайно воскрешен.

Мораль истории: убедитесь, что ваши объекты домена всегда текущие !!!

Смежные вопросы