Reputation: 1798
Spring Boot already have Jsr310Converters, but there is a problem with BulkOperations.
Here is a model:
@Document
@Data
@NoArgsConstructor
public class Data2 {
@Id
private String id;
private LocalDateTime createdAt;
private int value;
}
It works fine with MongoRepository and MongoTemplate. This code works fine:
Data2 data2 = new Data2();
data2.setValue(1);
data2.setCreatedAt(LocalDateTime.now());
data2Repository.save(data2);
mongoTemplate.updateFirst(
new Query(where("_id").is(data2.getId())),
new Update().set("createdAt", LocalDateTime.now().minusHours(1)).set("value", 2),
Data2.class);
But it fails with BulkOperations:
BulkOperations bulks = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, Data2.class);
bulks.updateOne(new Query(), new Update().set("createdAt", LocalDateTime.now().minusHours(1)).set("value", 3));
bulks.execute();
Here is a stacktrace:
Caused by: org.bson.codecs.configuration.CodecConfigurationException: Can't find a codec for class java.time.LocalDateTime.
at org.bson.codecs.configuration.CodecCache.getOrThrow(CodecCache.java:46) ~[bson-3.2.2.jar:na]
at org.bson.codecs.configuration.ProvidersCodecRegistry.get(ProvidersCodecRegistry.java:63) ~[bson-3.2.2.jar:na]
at org.bson.codecs.configuration.ProvidersCodecRegistry.get(ProvidersCodecRegistry.java:37) ~[bson-3.2.2.jar:na]
at com.mongodb.DBObjectCodec.writeValue(DBObjectCodec.java:210) ~[mongodb-driver-3.2.2.jar:na]
at com.mongodb.DBObjectCodec.encodeMap(DBObjectCodec.java:220) ~[mongodb-driver-3.2.2.jar:na]
at com.mongodb.DBObjectCodec.writeValue(DBObjectCodec.java:196) ~[mongodb-driver-3.2.2.jar:na]
at com.mongodb.DBObjectCodec.encode(DBObjectCodec.java:128) ~[mongodb-driver-3.2.2.jar:na]
at com.mongodb.DBObjectCodec.encode(DBObjectCodec.java:61) ~[mongodb-driver-3.2.2.jar:na]
at org.bson.codecs.BsonDocumentWrapperCodec.encode(BsonDocumentWrapperCodec.java:63) ~[bson-3.2.2.jar:na]
at org.bson.codecs.BsonDocumentWrapperCodec.encode(BsonDocumentWrapperCodec.java:29) ~[bson-3.2.2.jar:na]
at com.mongodb.connection.UpdateCommandMessage.writeTheWrites(UpdateCommandMessage.java:84) ~[mongodb-driver-core-3.2.2.jar:na]
at com.mongodb.connection.UpdateCommandMessage.writeTheWrites(UpdateCommandMessage.java:42) ~[mongodb-driver-core-3.2.2.jar:na]
at com.mongodb.connection.BaseWriteCommandMessage.encodeMessageBodyWithMetadata(BaseWriteCommandMessage.java:129) ~[mongodb-driver-core-3.2.2.jar:na]
at com.mongodb.connection.RequestMessage.encodeWithMetadata(RequestMessage.java:160) ~[mongodb-driver-core-3.2.2.jar:na]
at com.mongodb.connection.WriteCommandProtocol.sendMessage(WriteCommandProtocol.java:212) ~[mongodb-driver-core-3.2.2.jar:na]
at com.mongodb.connection.WriteCommandProtocol.execute(WriteCommandProtocol.java:101) ~[mongodb-driver-core-3.2.2.jar:na]
at com.mongodb.connection.UpdateCommandProtocol.execute(UpdateCommandProtocol.java:64) ~[mongodb-driver-core-3.2.2.jar:na]
at com.mongodb.connection.UpdateCommandProtocol.execute(UpdateCommandProtocol.java:37) ~[mongodb-driver-core-3.2.2.jar:na]
at com.mongodb.connection.DefaultServer$DefaultServerProtocolExecutor.execute(DefaultServer.java:159) ~[mongodb-driver-core-3.2.2.jar:na]
at com.mongodb.connection.DefaultServerConnection.executeProtocol(DefaultServerConnection.java:286) ~[mongodb-driver-core-3.2.2.jar:na]
at com.mongodb.connection.DefaultServerConnection.updateCommand(DefaultServerConnection.java:140) ~[mongodb-driver-core-3.2.2.jar:na]
at com.mongodb.operation.MixedBulkWriteOperation$Run$3.executeWriteCommandProtocol(MixedBulkWriteOperation.java:480) ~[mongodb-driver-core-3.2.2.jar:na]
at com.mongodb.operation.MixedBulkWriteOperation$Run$RunExecutor.execute(MixedBulkWriteOperation.java:646) ~[mongodb-driver-core-3.2.2.jar:na]
at com.mongodb.operation.MixedBulkWriteOperation$Run.execute(MixedBulkWriteOperation.java:399) ~[mongodb-driver-core-3.2.2.jar:na]
at com.mongodb.operation.MixedBulkWriteOperation$1.call(MixedBulkWriteOperation.java:179) ~[mongodb-driver-core-3.2.2.jar:na]
at com.mongodb.operation.MixedBulkWriteOperation$1.call(MixedBulkWriteOperation.java:168) ~[mongodb-driver-core-3.2.2.jar:na]
at com.mongodb.operation.OperationHelper.withConnectionSource(OperationHelper.java:230) ~[mongodb-driver-core-3.2.2.jar:na]
at com.mongodb.operation.OperationHelper.withConnection(OperationHelper.java:221) ~[mongodb-driver-core-3.2.2.jar:na]
at com.mongodb.operation.MixedBulkWriteOperation.execute(MixedBulkWriteOperation.java:168) ~[mongodb-driver-core-3.2.2.jar:na]
at com.mongodb.operation.MixedBulkWriteOperation.execute(MixedBulkWriteOperation.java:74) ~[mongodb-driver-core-3.2.2.jar:na]
at com.mongodb.Mongo.execute(Mongo.java:781) ~[mongodb-driver-3.2.2.jar:na]
at com.mongodb.Mongo$2.execute(Mongo.java:764) ~[mongodb-driver-3.2.2.jar:na]
at com.mongodb.DBCollection.executeBulkWriteOperation(DBCollection.java:2195) ~[mongodb-driver-3.2.2.jar:na]
at com.mongodb.DBCollection.executeBulkWriteOperation(DBCollection.java:2188) ~[mongodb-driver-3.2.2.jar:na]
at com.mongodb.BulkWriteOperation.execute(BulkWriteOperation.java:121) ~[mongodb-driver-3.2.2.jar:na]
at org.springframework.data.mongodb.core.DefaultBulkOperations.execute(DefaultBulkOperations.java:266) ~[spring-data-mongodb-1.9.3.RELEASE.jar:na]
at scratch4.service.DataService.test2(DataService.java:71) ~[classes/:na]
Spring Boot version: 1.4.1.RELEASE
Upvotes: 0
Views: 1383
Reputation: 11
I think the issue is that there is no converter registered for java.time.LocalDateTime
.
The way I got around it is to first convert it to a DBObject
and then create an update object from it:
Update.update(key, template.getConverter().convertToMongoType(value));
Not sure if this will work for your case though.
Upvotes: 1