簡體   English   中英

我如何使用PojoCodecProvider忽略getter / setter

[英]How do I ignore getters/setters with PojoCodecProvider

我正在嘗試將MongoCollection設置為使用數據傳輸對象pojo返回/保存,但是我不知道如何配置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);

我只需要pojo編解碼器在編碼/解碼時使用class屬性字段。 我對構建編解碼器部件具有完全控制權,因此,如果需要使用反射來構建ClassModel,那就很好。

(這是我使用ClassModel構建器嘗試過的方法,但是removeProperty似乎並沒有改變從構造函數引發的異常的任何內容 ,因此我再也沒有機會調用removeProperty。)

    final ClassModelBuilder<T> builder = ClassModel.builder(this.type);
    builder.removeProperty("iLink");
    final CodecProvider pojoCodecProvider = PojoCodecProvider.builder().register(builder.build()).build();

當前的PojoCodecProvider(從mongo-java-driver版本3.6.2起)不支持關閉getter / setter屬性。

您可以遍歷由構建器找到的屬性,並使用類似的功能刪除無效的屬性(可以按慣例包裝。請注意,驅動程序3.6.2在發現過程中比版本3.5.0更好)。

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);
    }
}

否則,您只需要將該對象隱蔽到您控制的版本即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM