前言
这里我说一下我用的版本为:
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver-sync</artifactId>
<version>4.7.2</version>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver-core</artifactId>
<version>4.7.2</version>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>bson</artifactId>
<version>4.7.2</version>
</dependency>
实体Model
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.bson.codecs.pojo.annotations.BsonId;
import org.bson.codecs.pojo.annotations.BsonProperty;
import org.bson.types.ObjectId;
import java.util.Date;
/**
* @author xxxxx
* @Date 2024-09-05 17:12:37
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MongoShakeVo {
private ObjectId id;
private Long ticketId;
private String srcMongodb;
private String destMongodb;
private String metaData;
private String configFile;
private Date createTime;
private Date updateTime;
}
报错的主要原因
failed with the following exception:
Failed to encode 'MongoShakeVo'. Encoding '_id' errored with: Failed to encode 'ObjectId'. Encoding 'date' errored with: Failed to encode 'Date'. Encoding 'date' errored with: Can't find a codec for class java.lang.Integer.
A custom Codec or PojoCodec may need to be explicitly configured and registered to handle this type.
Caused by: org.bson.codecs.configuration.CodecConfigurationException: Failed to encode 'MongoShakeVo'. Encoding '_id' errored with: Failed to encode 'ObjectId'. Encoding 'date' errored with: Failed to encode 'Date'. Encoding 'date' errored with: Can't find a codec for class java.lang.Integer.
Caused by: org.bson.codecs.configuration.CodecConfigurationException: Failed to encode 'ObjectId'. Encoding 'date' errored with: Failed to encode 'Date'. Encoding 'date' errored with: Can't find a codec for class java.lang.Integer.
Caused by: org.bson.codecs.configuration.CodecConfigurationException: Failed to encode 'Date'. Encoding 'date' errored with: Can't find a codec for class java.lang.Integer.
Caused by: org.bson.codecs.configuration.CodecConfigurationException: Can't find a codec for class java.lang.Integer.
详细报错日志
Failed to encode 'MongoShakeVo'. Encoding '_id' errored with: Failed to encode 'ObjectId'. Encoding 'date' errored with: Failed to encode 'Date'. Encoding 'date' errored with: Can't find a codec for class java.lang.Integer.
A custom Codec or PojoCodec may need to be explicitly configured and registered to handle this type.
at org.bson.codecs.pojo.AutomaticPojoCodec.encode(AutomaticPojoCodec.java:53)
at org.bson.codecs.BsonDocumentWrapperCodec.encode(BsonDocumentWrapperCodec.java:63)
at org.bson.codecs.BsonDocumentWrapperCodec.encode(BsonDocumentWrapperCodec.java:29)
at com.mongodb.internal.connection.SplittablePayload$WriteRequestEncoder.encode(SplittablePayload.java:200)
at com.mongodb.internal.connection.SplittablePayload$WriteRequestEncoder.encode(SplittablePayload.java:187)
at org.bson.codecs.BsonDocumentWrapperCodec.encode(BsonDocumentWrapperCodec.java:63)
at org.bson.codecs.BsonDocumentWrapperCodec.encode(BsonDocumentWrapperCodec.java:29)
at com.mongodb.internal.connection.BsonWriterHelper.writeDocument(BsonWriterHelper.java:77)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:800)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:800)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1471)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
Caused by: org.bson.codecs.configuration.CodecConfigurationException: Failed to encode 'MongoShakeVo'. Encoding '_id' errored with: Failed to encode 'ObjectId'. Encoding 'date' errored with: Failed to encode 'Date'. Encoding 'date' errored with: Can't find a codec for class java.lang.Integer.
错误代码示例截图
错误代码示例
private boolean mongoShakePlaceTheOrder(String uri, MongoShakeVo mongoShakeVo) {
log.info("uri-----------> {} ",uri);
CodecRegistry pojoCodecProvider = CodecRegistries.fromProviders(
PojoCodecProvider.builder().automatic(true).build()
);
try (MongoClient mongoClient = MongoClients.create(uri)) {
MongoDatabase database = mongoClient.getDatabase("meta").withCodecRegistry(pojoCodecProvider);
MongoCollection<MongoShakeVo> collection = database.getCollection("task",MongoShakeVo.class);
InsertOneResult result = collection.insertOne(mongoShakeVo);
log.info("Success! Inserted document id: {}", result.getInsertedId());
return result.getInsertedId() != null;
}catch (Exception e){
log.error(ExceptionUtils.getFullStackTrace(e));
return false;
}
}
更正后的代码示例截图
问题原因
主要是PoJo主动映射的问题,修改pojoCodecRegistry 即可,其他地方不变
主要修改
CodecRegistry pojoCodecRegistry = CodecRegistries.fromProviders(
PojoCodecProvider.builder().automatic(true).build()
修改为
PojoCodecProvider pojoCodecProvider = PojoCodecProvider.builder().automatic(true).build();
CodecRegistry codecRegistry = CodecRegistries.fromRegistries(MongoClientSettings.getDefaultCodecRegistry(),
CodecRegistries.fromProviders(pojoCodecProvider));