我正在尝试创建一个 Java 程序,用于从 MongoDB 读取和写入复杂对象,例如......
public class GameCharacter {
public String name;
public Weapon weapon;
public Armor armor;
public GameCharacter(String name, Weapon weapon, Armor armor) {
this.name = name;
this.weapon = weapon;
this.armor = armor;
}
}
Run Code Online (Sandbox Code Playgroud)
我已经成功地通过设置此编解码器来编写它,并且我可以在数据库中检查所有数据是否以正确的结构正确写入:
CodecRegistry defaultCodecRegistry = MongoClient.getDefaultCodecRegistry();
PojoCodecProvider pojoCodecProvider = PojoCodecProvider.builder().automatic(true).build();
CodecRegistry pojoCodecRegistry = fromRegistries(defaultCodecRegistry, fromProviders(pojoCodecProvider));
MongoDatabase characterDatabase = mongoDatabaseConnectionPool.getDatabase(CHARACTER_DATABASE_NAME);
characterDatabase = characterDatabase.withCodecRegistry(pojoCodecRegistry);
MongoCollection<GameCharacter> characterCollection = characterDatabase.getCollection(CHARACTER_COLLECTION_NAME, GameCharacter.class);
Character testCharacter = new Character ("Sylvia Zerin", testWeapon, testArmor);
characterCollection.insertOne(testCharacter);
Run Code Online (Sandbox Code Playgroud)
...但是,当尝试再次从该数据库读取 GameCharacter 时,如下所示:
FindIterable<GameCharacter> characters = characterCollection.find();
Run Code Online (Sandbox Code Playgroud)
...然后出现以下错误消息:
org.bson.codecs.configuration.CodecConfigurationException: An exception occurred when decoding using the AutomaticPojoCodec.
Decoding into a 'GameCharacter' failed with the following exception:
Cannot find a public constructor for 'GameCharacter'.
A custom Codec or PojoCodec may need to be explicitly configured and registered to handle this type.
Run Code Online (Sandbox Code Playgroud)
这让我感到困惑,因为我为 GameCharacter 类提供了一个公共构造函数。我不清楚为什么程序找不到它。
根据这个问题的答案,我还尝试了以下方法来设置编解码器:
ClassModel<GameCharacter> gameCharacterClassModel = ClassModel.builder(GameCharacter.class).enableDiscriminator(true).build();
CodecRegistry defaultCodecRegistry = MongoClient.getDefaultCodecRegistry();
CodecRegistry pojoCodecRegistry = fromRegistries(defaultCodecRegistry, fromProviders(PojoCodecProvider.builder().register(gameCharacterClassModel).automatic(true).build()));
return pojoCodecRegistry;
Run Code Online (Sandbox Code Playgroud)
...但是,这只会将错误消息稍微更改为:
org.bson.codecs.configuration.CodecConfigurationException: Cannot find a public constructor for 'GameCharacter'.
Run Code Online (Sandbox Code Playgroud)
我需要做什么才能再次从 MongoDB 检索 GameCharacterObject?
我想到了。
该错误消息有些误导。实际上,问题在于它需要一个没有参数的空构造函数,所以上面我的类中的构造函数自然无法工作。此处定义的确切要求如下:
默认情况下,所有 POJO必须包含一个公共或受保护的、空的、无参数的构造函数。
因此,可以通过将 GameCharacter 类更改为如下所示来解决该问题:
public class GameCharacter {
public String name;
public Weapon weapon;
public Armor armor;
public GameCharacter() {
}
public GameCharacter(String name, Weapon weapon, Armor armor) {
this.name = name;
this.weapon = weapon;
this.armor = armor;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3321 次 |
| 最近记录: |