简体   繁体   English

mongo-operations spring mongo批量操作执行异常(CodecConfigurationException:找不到类的编解码器)

[英]mongo-operations spring mongo bulk opeartion execution exception (CodecConfigurationException: Can't find a codec for class)

I was trying to perform a bulk operation in mongodb using spring mongo operations class. 我试图使用Spring mongo操作类在mongodb中执行批量操作。

These are my POJO classes : 这些是我的POJO类:

@Document(collection = "location_settings_mst")
public class LocationSettingsEntity {
    @Id
    private String id;
    @Field("userId")
    private String userId;
    @Field("location")
    private List<LocationSettingEntity> locationSettings = new LinkedList<>();
    // Getters and Setters
}

public class LocationSettingEntity {
    @Field("name")
    private String name;
    @Field("latitude")
    private double lat;
    @Field("longitude")
    private double lon;
    @Field("geoPoint")
    private String geoPoint;
    // Getters and Setters
}

but, when I try to perform the following bulk operation : 但是,当我尝试执行以下批量操作时:

// Here mongo is an object of type org.springframework.data.mongodb.core.MongoOperations
BulkOperations bulkOps = mongo.bulkOps(BulkMode.ORDERED, LocationSettingsEntity.class); 
Query query = new Query();
List<LocationSettingEntity> list = new LinkedList<>(); // this list contains LocationSettingEntity objects
query.addCriteria(Criteria.where("userId").is(userId));
Update update = new Update();
update.pushAll("location", list.toArray());
bulkOps = bulkOps.updateOne(query, update);
bulkOps.execute();

I get the following error : 我收到以下错误:

org.bson.codecs.configuration.CodecConfigurationException: Can't find a codec for class com.panasonic.persistence.entity.LocationSettingEntity.
    at org.bson.codecs.configuration.CodecCache.getOrThrow(CodecCache.java:46)
    at org.bson.codecs.configuration.ProvidersCodecRegistry.get(ProvidersCodecRegistry.java:63)
    at org.bson.codecs.configuration.ProvidersCodecRegistry.get(ProvidersCodecRegistry.java:37)
    at com.mongodb.DBObjectCodec.writeValue(DBObjectCodec.java:210)
    at com.mongodb.DBObjectCodec.encodeMap(DBObjectCodec.java:220)
    at com.mongodb.DBObjectCodec.writeValue(DBObjectCodec.java:196)
    at com.mongodb.DBObjectCodec.encode(DBObjectCodec.java:128)
    at com.mongodb.DBObjectCodec.encode(DBObjectCodec.java:61)
    at org.bson.codecs.BsonDocumentWrapperCodec.encode(BsonDocumentWrapperCodec.java:63)
    at org.bson.codecs.BsonDocumentWrapperCodec.encode(BsonDocumentWrapperCodec.java:29)
    at com.mongodb.connection.UpdateCommandMessage.writeTheWrites(UpdateCommandMessage.java:84)
    at com.mongodb.connection.UpdateCommandMessage.writeTheWrites(UpdateCommandMessage.java:42)
    at com.mongodb.connection.BaseWriteCommandMessage.encodeMessageBodyWithMetadata(BaseWriteCommandMessage.java:129)
    at com.mongodb.connection.RequestMessage.encodeWithMetadata(RequestMessage.java:160)
    at com.mongodb.connection.WriteCommandProtocol.sendMessage(WriteCommandProtocol.java:212)
    at com.mongodb.connection.WriteCommandProtocol.execute(WriteCommandProtocol.java:101)
    at com.mongodb.connection.UpdateCommandProtocol.execute(UpdateCommandProtocol.java:64)
    at com.mongodb.connection.UpdateCommandProtocol.execute(UpdateCommandProtocol.java:37)
    at com.mongodb.connection.DefaultServer$DefaultServerProtocolExecutor.execute(DefaultServer.java:159)
    at com.mongodb.connection.DefaultServerConnection.executeProtocol(DefaultServerConnection.java:286)
    at com.mongodb.connection.DefaultServerConnection.updateCommand(DefaultServerConnection.java:140)
    at com.mongodb.operation.MixedBulkWriteOperation$Run$3.executeWriteCommandProtocol(MixedBulkWriteOperation.java:480)
    at com.mongodb.operation.MixedBulkWriteOperation$Run$RunExecutor.execute(MixedBulkWriteOperation.java:646)
    at com.mongodb.operation.MixedBulkWriteOperation$Run.execute(MixedBulkWriteOperation.java:399)
    at com.mongodb.operation.MixedBulkWriteOperation$1.call(MixedBulkWriteOperation.java:179)
    at com.mongodb.operation.MixedBulkWriteOperation$1.call(MixedBulkWriteOperation.java:168)
    at com.mongodb.operation.OperationHelper.withConnectionSource(OperationHelper.java:230)
    at com.mongodb.operation.OperationHelper.withConnection(OperationHelper.java:221)
    at com.mongodb.operation.MixedBulkWriteOperation.execute(MixedBulkWriteOperation.java:168)
    at com.mongodb.operation.MixedBulkWriteOperation.execute(MixedBulkWriteOperation.java:74)
    at com.mongodb.Mongo.execute(Mongo.java:781)
    at com.mongodb.Mongo$2.execute(Mongo.java:764)
    at com.mongodb.DBCollection.executeBulkWriteOperation(DBCollection.java:2195)
    at com.mongodb.BulkWriteOperation.execute(BulkWriteOperation.java:136)
    at org.springframework.data.mongodb.core.DefaultBulkOperations.execute(DefaultBulkOperations.java:266)

I tried to debug and found that com.mongodb library check for Codecs for datatypes and when it doesn't find one, it throws the error. 我尝试调试,发现com.mongodb库检查是否有数据类型的编解码器,当找不到时,会引发错误。 As far as I understand spring mongo operation is capable of handling POJOs. 据我了解,Spring mongo操作能够处理POJO。

I don't understand what am I missing. 我不明白我在想什么。 Please help ! 请帮忙 ! ! !

Technically you would write a custom codec here's how . 从技术上讲,您将编写自定义编解码器,方法如下 I did that but it did not work i then dived into the Mongo Driver Code and there seems to be a mistake. 我做到了,但没有成功,然后我进入了Mongo驱动程序代码,似乎有一个错误。

Looks like they made a mistake here - com.mongodb.DBCollection#DBCollection(java.lang.String, com.mongodb.DB, com.mongodb.operation.OperationExecutor) 看起来他们在这里犯了一个错误-com.mongodb.DBCollection#DBCollection(java.lang.String,com.mongodb.DB,com.mongodb.operation.OperationExecutor)

DBObjectCodec getDefaultDBObjectCodec() {
    return new DBObjectCodec(MongoClient.getDefaultCodecRegistry(),
                             DBObjectCodec.getDefaultBsonTypeClassMap(),
                             getObjectFactory());
}

Here they set the collection Codec from the default static codec registry, which therefore will never be able to pick up the custom codecs that people write. 他们在这里从默认的静态编解码器注册表中设置集合编解码器,因此将永远无法提取人们编写的自定义编解码器。 there are many ppl on the internet stuck on this problem. 互联网上有很多人死于这个问题。

The problem can however be solved by converting the update payload into a DBObject which can be done using a com.mongodb.BasicDBObjectBuilder class and is pretty straighforward. 但是,可以通过将更新有效负载转换为DBObject来解决此问题,这可以使用com.mongodb.BasicDBObjectBuilder类完成,并且非常简单。 not sure if the performance will be as good as a codec. 不确定性能是否会与编解码器一样好。 I am thinking of writing my own DBObject builder which will give me the performance. 我正在考虑编写自己的DBObject构建器,它将为我带来性能。 since the basic one is using json i think. 因为我认为基本的是使用json。

Update update = new Update();
update.pushAll("location", list.stream().map(BasicDBObjectBuilder.start().add(//key,value pairs).get()).collect(Collectors.toList()).toArray());
bulkOps = bulkOps.updateOne(query, update);
bulkOps.execute();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 spring-boot 2.1.0 mongo-CodecConfigurationException:找不到类java.time.Year的编解码器 - spring-boot 2.1.0 mongo - CodecConfigurationException: Can't find a codec for class java.time.Year 找不到我的课程的编解码器(CodecConfigurationException) - Can't find a codec for my class (CodecConfigurationException) Morphia - CodecConfigurationException:找不到类的编解码器 - 但类已注册 - Morphia - CodecConfigurationException: Can't find a codec for class - But class is registered Spring Webflux Reactive Mongo Bulk Operations (Java) - Spring Webflux Reactive Mongo Bulk Operations (Java) 春季:Mongo配置找不到“ mongo:repositories” - Spring: Mongo configuration can't find “mongo:repositories” MongoDB jodatime:org.bson.codecs.configuration.CodecConfigurationException:找不到类org.joda.time.DateTime的编解码器 - MongoDB jodatime: org.bson.codecs.configuration.CodecConfigurationException: Can't find a codec for class org.joda.time.DateTime org.bson.codecs.configuration.CodecConfigurationException:找不到类 org.hibernate.ogm.datastore.mongodb.type.GridFS 的编解码器 - org.bson.codecs.configuration.CodecConfigurationException: Can't find a codec for class org.hibernate.ogm.datastore.mongodb.type.GridFS MongoDB 的不可变自动生成存储库抛出“找不到接口的编解码器” CodecConfigurationException - Immutables Autogenerated repository for MongoDB throws "Can't find a codec for interface" CodecConfigurationException MongoDB Java 插入引发 org.bson.codecs.configuration.CodecConfigurationException:找不到类 io.github.ilkgunel.mongodb.Pojo 的编解码器 - MongoDB Java Inserting Throws org.bson.codecs.configuration.CodecConfigurationException: Can't find a codec for class io.github.ilkgunel.mongodb.Pojo Spring Data Mongo版本1.9已连接但无法进行CRUD操作 - Spring Data Mongo version 1.9 is connected but can't make CRUD operations
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM