当前位置: 首页 > 知识库问答 >
问题:

我如何使用PojoCodecProvider忽略接球手/二传手

赵浩邈
2023-03-14

我试图使用数据传输对象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);

我只需要pojo编解码器在编码/解码时使用类属性字段。我完全可以控制编译码部分的构建,所以如果我需要使用反射来构建类模型,那也没关系。

(这是我在ClassModel builder中尝试过的,但是 removeProperty似乎没有改变任何东西 异常是从构造函数中抛出的,所以我从来没有机会调用removeProperty。)

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

共有1个答案

哈翔
2023-03-14

PojoCodecProvider当前(截至mongo-java-驱动程序的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);
    }
}

否则,您只需将相关对象转换为您可以控制的版本。

 类似资料:
  • 我遇到的问题是一些类是从一个有getter但没有setter的接口实现的。 我确实希望从客户端获得getter值,所以我不能使用@jsonIgnore注释,因为它会完全忽略该属性,包括序列化和反序列化。我需要序列化时的属性。 还有别的办法吗?

  • 问题内容: 这个问题本质上是相反的这一个 我有这样的方法: 当我加载它时,Hibernate抱怨我没有称为的属性。但是我不想要一个叫做-我不需要存储数据的属性-这仅仅是逻辑。 hibernate状态: org.hibernate.PropertyNotFoundException:在com.mycomp.myclass类中找不到空置属性的设置器… 我可以在方法中添加注释以使Hibernate忽略它

  • 我有以下设置: 和neo4j-browser包括使用(目标是能够使用REST和web浏览器调试嵌入式数据库): 并开始使用: spring boot坚持尝试将Jetty作为servlet容器,即使主应用类有以下配置注释: 但是spring使用的jetty版本(8)不支持web套接字,所以我得到了 我如何告诉spring boot忽略Jetty并始终使用Tomcat? 依赖项树:

  • 问题内容: 我想知道如何使用Spring Framework将属性从对象源复制到对象目的地,而忽略空值。 我实际上使用带有此代码的Apache beanutils 去做吧。但是现在我需要使用Spring。 有什么帮助吗? 多谢 问题答案: 您可以创建自己的方法来复制属性,而忽略空值。

  • 问题内容: 我的python脚本执行一个路径,其中路径是一个队列,其中包含我需要一个一个对待的档案。 问题是我将列表放入数组中,然后执行一个简单的。直到我将项目置于颠覆状态之前,一切都很好。现在,我将文件夹保存在数组中,这当然会使我的应用程序崩溃。 所以这是我的问题:是否有一个函数在执行时会忽略隐藏文件,如果不是,那是最好的方法? 问题答案: 您可以自己写一个: 或者您可以使用glob: 这些文件

  • 问题内容: 我正在尝试为api 编写Web服务。因此,我编写了一个MyLogRecord类,该类继承自LogRecord。我用JAX- B注释对此类进行了注释,包括,因此它将忽略未注释的字段和属性。当我启动tomcat时,出现错误,并且其他类没有默认的构造函数,但是没有带注释的方法对Level类或任何其他类进行任何引用。这些由父类引用。 我的子类具有需要定义的所有内容。如何使JAX-B完全忽略父类