我有一个名为Signal的简单类。课程如下:
public class Signal {
private String id;
private Date timestamp;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Date getTimestamp() {
return timestamp;
}
public void setTimestamp(Date timestamp) {
this.timestamp = timestamp;
}
}
我正在尝试在MongoDB中插入信号(v3.4)。我使用以下方法插入:
public boolean xyz(Signal signal) {
try {
DatabaseConnection databaseConnection =DatabaseConnection.getInstance();
MongoClient mongoClient = databaseConnection.getMongoClient();
MongoDatabase db = mongoClient.getDatabase("myDb");
MongoCollection<Signal> collection = db.getCollection("myCollection", Signal.class);
collection.insertOne(signal);
return true;
} catch (Exception e){
logger.error("Error", e);
return false;
}
}
我收到以下异常:
org.bson.codecs.configuration.CodecConfigurationException:找不到 类的编解码器in.co.mysite.webapi.models.Signal。
我检查过类似的问题here,但插入代码不同。我从答案中提取了提示并修改了我的方法,但它看起来并不干净。修改方法如下:
public boolean xyz(Signal signal) {
try {
DatabaseConnection databaseConnection =DatabaseConnection.getInstance();
MongoClient mongoClient = databaseConnection.getMongoClient();
MongoDatabase db = mongoClient.getDatabase("myDb");
MongoCollection<Document> collection = db.getCollection("myCollection");
Document doc = new Document();
doc.put("id", signal.getId());
doc.put("timestamp", signal.getTimestamp());
doc.put("_id", new ObjectId().toString());
collection.insertOne(doc);
return true;
} catch (Exception e){
logger.error("Error", e);
return false;
}
}
答案 0 :(得分:1)
按照POJO快速入门指南进行操作。您需要注册编解码器以将POJO(Plain Old Java Object)转换为BSON或从BSON转换: http://mongodb.github.io/mongo-java-driver/3.7/driver/getting-started/quick-start-pojo/
答案 1 :(得分:1)
文档: MongoDB Driver Quick Start - POJOs
遵循上述文档后,如果仍然出现错误,则
您可能会在馆藏之类的内部使用通用文档,例如
class DocStore {
String docId:
String docType;
Object document; // this will cause the BSON cast to throw a codec error
Map<String, Object> document; // this won't
}
而且,您仍然希望投射文档 从 POJO 到地图
mkyong来救援。
对于抓取,它可以按预期工作,但是您可能希望将其从Map转换为POJO作为后期处理步骤,我们可以找到一些不错的答案here
希望有帮助! ?️
答案 2 :(得分:0)
您是否注释了您的Java类?看起来您需要在您的班级上方使用@Entity,并且在您的ID字段上方需要@Id。
答案 3 :(得分:0)
您需要配置CodecRegistry
来管理从bson到pojos的翻译:
MongoClientURI connectionString = new MongoClientURI("mongodb://localhost:27017");
MongoClient mongoClient = new MongoClient(connectionString);
CodecRegistry pojoCodecRegistry = org.bson.codecs.configuration.CodecRegistries.fromRegistries(MongoClientSettings.getDefaultCodecRegistry(), org.bson.codecs.configuration.CodecRegistries.fromProviders(PojoCodecProvider.builder().automatic(true).build()));
MongoDatabase database = mongoClient.getDatabase("testdb").withCodecRegistry(pojoCodecRegistry);
PS:您可以静态导入org.bson.codecs.configuration.CodecRegistries.fromRegistries
和org.bson.codecs.configuration.CodecRegistries.fromProviders
。
可以在github中找到完整的示例。
Mongodb java driver documentation还包含有关管理pojos的文章(该链接适用于3.8.0驱动程序版本)。