MongoDB Java读取GameCharacter对象遇CodecConfigurationException问题求助
解决MongoDB读取GameCharacter对象的CodecConfigurationException问题
嘿,这个问题我之前也碰到过!报错的核心原因其实很明确:MongoDB的AutomaticPojoCodec默认会尝试用公共无参构造函数来实例化你的GameCharacter对象,哪怕你已经定义了带参构造,它还是会优先找无参的,找不到就会抛出这个错误。下面给你两种可行的解决办法:
方案一:给GameCharacter加个公共无参构造(最简单)
这是最直接的解决方案,只需要在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; } }
加完之后,你之前的CodecRegistry配置完全不用改,直接运行读取代码就能正常拿到对象了。
方案二:配置ClassModel指定使用带参构造(不想加无参构造的话)
如果你不想加无参构造,可以通过ClassModel明确告诉PojoCodec要使用你定义的带参构造。需要在构建ClassModel时把构造器的参数和类的字段对应起来:
ClassModel<GameCharacter> gameCharacterClassModel = ClassModel.builder(GameCharacter.class) // 明确指定要使用的带参构造,参数顺序要和构造器里的一致 .constructor(ConstructorModel.builder() .addParameter("name", String.class) .addParameter("weapon", Weapon.class) .addParameter("armor", Armor.class) .build()) .enableDiscriminator(true) // 如果你的业务需要鉴别器就保留,不需要可以删掉 .build(); // 重新构建CodecRegistry CodecRegistry defaultCodecRegistry = MongoClient.getDefaultCodecRegistry(); CodecRegistry pojoCodecRegistry = fromRegistries(defaultCodecRegistry, fromProviders(PojoCodecProvider.builder() .register(gameCharacterClassModel) .automatic(true) .build())); // 后续获取数据库和集合的代码不变 MongoDatabase characterDatabase = mongoDatabaseConnectionPool.getDatabase(CHARACTER_DATABASE_NAME) .withCodecRegistry(pojoCodecRegistry); MongoCollection<GameCharacter> characterCollection = characterDatabase.getCollection(CHARACTER_COLLECTION_NAME, GameCharacter.class);
这样配置后,Codec就会乖乖用你定义的带参构造来创建GameCharacter实例了,不用依赖无参构造。
额外提醒
别忘了你的Weapon和Armor类也要满足同样的规则哦!要么给它们也加无参构造,要么也配置对应的ClassModel,不然读取的时候可能会出现同样的报错。另外,你的字段都是public的,这一点很友好,要是字段是私有的话还得加getter/setter或者配置字段访问策略,不过你现在的情况没问题~
内容的提问来源于stack exchange,提问作者Kira Resari
相关产品推荐
相关产品推荐

