MongoDB Java CodecConfigurationException 找不到公共构造函数

Kir*_*ari 2 java mongodb

我正在尝试创建一个 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?

Kir*_*ari 7

我想到了。

该错误消息有些误导。实际上,问题在于它需要一个没有参数的构造函数,所以上面我的类中的构造函数自然无法工作。此处定义的确切要求如下:

默认情况下,所有 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)