为 MongoDB 抛出 "Can't find a codec for class Immutable.." 自动生成的不可变对象
Immutables autogenerated for MongoDB throws "Can't find a codec for class Immutable.."
问题描述。
所以我有一个项目想与 MongoDB
一起使用
@Value.Immutable
@Gson.TypeAdapters
@Criteria.Repository
interface Person {
@Criteria.Id
String id();
String fullName();
}
为了支持 pojos,我创建了一个具有以下设置的 MongoClient:
CodecRegistry pojoCodecRegistry = fromProviders(PojoCodecProvider.builder().automatic(true).build());
CodecRegistry codecRegistry = fromRegistries(MongoClientSettings.getDefaultCodecRegistry(), pojoCodecRegistry);
MongoClientSettings clientSettings = MongoClientSettings.builder()
.applyConnectionString(connectionString)
.codecRegistry(codecRegistry)
.build();
但是,每当我尝试执行插入操作时,我都会收到错误消息,而 bson 找不到不可变的编解码器 class。
产生问题的代码:
MongoCollection<Person> people = db.getCollection("peoples", Person.class).withCodecRegistry(pojoCodecRegistry);
Person person = ImmutablePerson.builder()
.id("1")
.fullName("person")
.build();
InsertOneResult result = people.insertOne(shahar);
错误:
Exception in thread "main" org.bson.codecs.configuration.CodecConfigurationException: Can't find a codec for class with.immutables.ImmutablePerson.
我已尝试将 ClassModel 注册到 ImmutablePerson 的 CodecRegistry,如下所示
.register(ClassModel.builder(ImmutablePerson.class).enableDiscriminator(true).build())
但是,它保存的是“实例”而不是其中的数据
问题
需要更改什么才能使简单的插入操作起作用?
是否可以使用不可变对象来做到这一点?
我找到了一个有效的解决方案:
@Value.Immutable
@Criteria
@Criteria.Repository
@JsonSerialize(as = ImmutableUser.class)
@JsonDeserialize(as = ImmutableUser.class)
public interface User {
@Criteria.Id
ObjectId _id();
String firstName();
String lastName();
UserNameAndPassword userNameAndPassword();
}
通过设置上述注释,从“jackson-core”和不可变变量“criteria-common”导入,在编译代码时创建了相应的存储库,在本例中为“UserRepository”,然后可用于执行CRUD操作。
添加用户示例:
UserRepository users = new UserRepository(mongoManager.getBackend());
users.insert(user); // add
users.users.find(UserCriteria...); // read
users.update(user); // update
users.delete(UserCriteria...); // delete
我建议阅读 immutables-Criteria, additionally, I've used the examples provided in the following repository immutables-git-repo,根据条件->mongo。
问题描述。
所以我有一个项目想与 MongoDB
一起使用@Value.Immutable
@Gson.TypeAdapters
@Criteria.Repository
interface Person {
@Criteria.Id
String id();
String fullName();
}
为了支持 pojos,我创建了一个具有以下设置的 MongoClient:
CodecRegistry pojoCodecRegistry = fromProviders(PojoCodecProvider.builder().automatic(true).build());
CodecRegistry codecRegistry = fromRegistries(MongoClientSettings.getDefaultCodecRegistry(), pojoCodecRegistry);
MongoClientSettings clientSettings = MongoClientSettings.builder()
.applyConnectionString(connectionString)
.codecRegistry(codecRegistry)
.build();
但是,每当我尝试执行插入操作时,我都会收到错误消息,而 bson 找不到不可变的编解码器 class。
产生问题的代码:
MongoCollection<Person> people = db.getCollection("peoples", Person.class).withCodecRegistry(pojoCodecRegistry);
Person person = ImmutablePerson.builder()
.id("1")
.fullName("person")
.build();
InsertOneResult result = people.insertOne(shahar);
错误:
Exception in thread "main" org.bson.codecs.configuration.CodecConfigurationException: Can't find a codec for class with.immutables.ImmutablePerson.
我已尝试将 ClassModel 注册到 ImmutablePerson 的 CodecRegistry,如下所示
.register(ClassModel.builder(ImmutablePerson.class).enableDiscriminator(true).build())
但是,它保存的是“实例”而不是其中的数据
问题
需要更改什么才能使简单的插入操作起作用? 是否可以使用不可变对象来做到这一点?
我找到了一个有效的解决方案:
@Value.Immutable
@Criteria
@Criteria.Repository
@JsonSerialize(as = ImmutableUser.class)
@JsonDeserialize(as = ImmutableUser.class)
public interface User {
@Criteria.Id
ObjectId _id();
String firstName();
String lastName();
UserNameAndPassword userNameAndPassword();
}
通过设置上述注释,从“jackson-core”和不可变变量“criteria-common”导入,在编译代码时创建了相应的存储库,在本例中为“UserRepository”,然后可用于执行CRUD操作。
添加用户示例:
UserRepository users = new UserRepository(mongoManager.getBackend());
users.insert(user); // add
users.users.find(UserCriteria...); // read
users.update(user); // update
users.delete(UserCriteria...); // delete
我建议阅读 immutables-Criteria, additionally, I've used the examples provided in the following repository immutables-git-repo,根据条件->mongo。