为 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。