我试图使用数据传输对象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();
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完全忽略父类