0

MongoJack と updateById メソッドの使用に問題があります。

MongoJack の javadoc では、メソッド 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");
}
}

テストは最初のアサーションで失敗します。mongojack の javadoc を誤解した場合や、その他のエラーが発生した場合はお知らせください。

4

1 に答える 1

1

OK、javadoc とチュートリアルが壊れています。解決策は、アノテーション @ObjectId を _id フィールドに追加することです。

@ObjectId
public String _id;
于 2014-09-08T08:51:32.737 に答える