Java 如何使用PojoCodecProvider忽略getter/setter

Java 如何使用PojoCodecProvider忽略getter/setter,java,mongodb,codec,Java,Mongodb,Codec,我试图使用数据传输对象pojo将MongoCollection设置为返回/保存,但我不知道如何将pojo编解码器配置为忽略getter/setter 现在我发现了错误 Caused by: org.bson.codecs.configuration.CodecConfigurationException: Property 'iLink' in BasicRecord, has differing data types: TypeData{type=BasicLink} and TypeData

我试图使用数据传输对象pojo将MongoCollection设置为返回/保存,但我不知道如何将pojo编解码器配置为忽略getter/setter

现在我发现了错误

Caused by: org.bson.codecs.configuration.CodecConfigurationException: Property 'iLink' in BasicRecord, has differing data types: TypeData{type=BasicLink} and TypeData{type=ILink}
我不控制数据传输对象,并且没有“iLink”属性。(该属性只是“link”,而对象属性名(已经是“link”)用于系统之间的序列化/反序列化。getILink只是从ILink接口继承的getLink的通用版本)

下面是我构建pojo编解码器的代码

    // Create a Codec for converting BsonDate to java.time.Instant
    final HashMap<BsonType, Class<?>> replacements = new HashMap<>();
    replacements.put(BsonType.DATE_TIME, Instant.class);
    final BsonTypeClassMap bsonTypeClassMap = new BsonTypeClassMap(replacements);
    final Codec<Document> instantCodec = new DocumentCodec(MongoClient.getDefaultCodecRegistry(), bsonTypeClassMap);

    // Create class Codec
    final CodecProvider pojoCodecProvider = PojoCodecProvider.builder().register(this.type).build();

    // Combine Codecs together into one registry
    final CodecRegistry pojoCodecRegistry = CodecRegistries.fromRegistries(CodecRegistries.fromCodecs(instantCodec),
            CodecRegistries.fromProviders(pojoCodecProvider), MongoClient.getDefaultCodecRegistry());

    final MongoDatabase database = this.client.getDatabase(database_name).withCodecRegistry(pojoCodecRegistry);
    this.collection = database.getCollection(collection_name, classType);
//创建用于将BsonDate转换为java.time.Instant的编解码器

final HashMapPojoCodecProvider当前(从mongo java驱动程序的3.6.2版开始)不支持关闭getter/setter属性

您可以使用这样的函数(您可以将其包装为。请注意,驱动程序3.6.2在发现过程中比版本3.5.0更好)迭代生成器找到的属性并删除无效的属性

private void stripNonProperty(最终类建模器,类类型){
//需要中间列表。在对列表进行迭代时无法从列表中删除
最终ArrayList名称=新ArrayList();
对于(最终org.bson.codecs.pojo.PropertyModelBuilder属性:builder.getPropertyModelBuilders()){
最终字符串名称=property.getName();
如果(!isField(名称、类型)){
名称。添加(名称);
}
}
for(最终字符串名称:名称){
建造商。移除财产(名称);
}
}
否则,您只需将有问题的对象转换为您可以控制的版本

    final ClassModelBuilder<T> builder = ClassModel.builder(this.type);
    builder.removeProperty("iLink");
    final CodecProvider pojoCodecProvider = PojoCodecProvider.builder().register(builder.build()).build();
private void stripNonProperties(final ClassModelBuilder<T> builder, Class<T> type) {
    // Need intermediary list. Can't remove from list while iterating over it
    final ArrayList<String> names = new ArrayList<>();

    for (final org.bson.codecs.pojo.PropertyModelBuilder<?> property : builder.getPropertyModelBuilders()) {
        final String name = property.getName();
        if (!isField(name, type)) {
            names.add(name);
        }
    }

    for (final String name : names) {
        builder.removeProperty(name);
    }
}