Использование MongoJack и updateById
У меня проблема с использованием метода MongoJack и updateById.
В javadoc от MongoJack говорится, что метод updateById(K, T) ( ссылка на javadoc) может использоваться с K в качестве ключа и T в качестве объекта для сохранения. Однако следующий код и тест показывают, что это не так. Полный исходный код можно найти на Github: https://github.com/nilsmagnus/mongojackupdatebyid/.
Объект для сохранения:
package no.nils.mongoupdate;
public class Scenario {
public String _id;
public String name;
public Scenario(String name) {
this.name = name;
}
public String get_id() {
return _id;
}
public String getName() {
return name;
}
}
Обновление класса:
package no.nils.mongoupdate;
import org.mongojack.JacksonDBCollection;
import org.mongojack.WriteResult;
import com.mongodb.DB;
import com.mongodb.DBCollection;
class ScenarioStorage {
private JacksonDBCollection<Scenario, String> scenarioCollection;
public ScenarioStorage(DB db) {
DBCollection dbCollection = db.getCollection("scenario");
scenarioCollection = JacksonDBCollection.wrap(dbCollection, Scenario.class, String.class);
}
public void update(Scenario scenario) {
WriteResult<Scenario, String> writeResult = scenarioCollection.updateById(scenario._id, scenario);
if (writeResult.getError() != null) throw new RuntimeException(writeResult.getError());
}
public String saveNewScenario(Scenario scenario) {
WriteResult<Scenario, String> writeResult = scenarioCollection.insert(scenario);
if (writeResult.getError() != null) throw new RuntimeException(writeResult.getError());
return writeResult.getSavedId();
}
public Scenario getScenario(String id) {
return scenarioCollection.findOneById(id);
}
}
Тест, который показывает сбой:
package no.nils.mongoupdate;
import java.net.UnknownHostException;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import org.junit.Before;
import org.junit.Test;
import com.mongodb.DB;
import com.mongodb.MongoClient;
public class ScenarioStorageTest {
private ScenarioStorage storage;
@Before
public void createDb() throws UnknownHostException {
MongoClient mongoClient = new MongoClient("localhost", 27017);
DB db = mongoClient.getDB("junittest");
storage = new ScenarioStorage(db);
}
@Test
public void shouldUpdateNameAfterUpdate() {
Scenario scenario = new Scenario("first");
final String id = storage.saveNewScenario(scenario);
scenario._id = id;
scenario.name = "newname";
storage.update(scenario);
Scenario updated = storage.getScenario(id);
assertNotNull("Stored object should have been fetched.", updated.name);
assertEquals("The stored object should now have the name 'newname'.", updated.name, "newname");
}
}
Тест не пройден при первом утверждении. Пожалуйста, сообщите, если я неправильно понял javadoc для mongojack или любые другие ошибки, которые я, возможно, сделал.
1 ответ
Решение
Хорошо, Javadoc и учебник не работает. Решение состоит в том, чтобы добавить аннотацию @ObjectId в поле _id.
@ObjectId
public String _id;