【发布时间】:2023-03-16 01:20:01
【问题描述】:
我的问题是将MongoDB 文档转换为一种类型:
getCollectionjavadoc 说:
/**
* Gets a collection, with a specific default document class.
*
* @param collectionName the name of the collection to return
* @param documentClass the default class to cast any documents returned from the database into.
* @param <TDocument> the type of the class to use instead of {@code Document}.
* @return the collection
*/
<TDocument> MongoCollection<TDocument> getCollection(String collectionName, Class<TDocument> documentClass);
这是我的实现:
public class AccountDAO {
public static FindIterable<AccountDTO> accountPersist(AccountDTO accountDTO){
MongoCollection<AccountDTO> accountDataCollection = Utils.getDbCollection();
accountDataCollection.insertOne(accountDTO);
return accountDataCollection.find();
}
}
还有getDbCollection:
public static MongoCollection<AccountDTO> getDbCollection() {
MongoDatabase db = Utils.getDbConnect();
MongoCollection<AccountDTO> accountDataCollection = null ;
accountDataCollection = db.getCollection(AccountDTO.COLLECTION_NAME,AccountDTO.class);
return accountDataCollection;
}
CodecImplementationProvider:
package utils;
import org.bson.BsonReader;
import org.bson.BsonWriter;
import org.bson.codecs.Codec;
import org.bson.codecs.DecoderContext;
import org.bson.codecs.EncoderContext;
import org.bson.codecs.configuration.CodecRegistry;
import digester.Account;
import digester.Customer;
import dto.AccountDTO;
// the Codec extends two interfaces: Encoder<T>, Decoder<T>
class MyAccountDTOImpCodec implements Codec<AccountDTO> {
private CodecRegistry codecRegistry;
public MyAccountDTOImpCodec(CodecRegistry codecRegistry) {
this.codecRegistry = codecRegistry;
}
public void encode(BsonWriter writer, AccountDTO doc, EncoderContext encoderContext) {
writer.writeStartDocument();
writer.writeName("IBAN");
writer.writeString(doc.getIBAN());
writer.writeName("customerFirstName");
writer.writeString(doc.getCustomerFirstName());
writer.writeName("customerLastName");
writer.writeString(doc.getCustomerLastName());
writer.writeEndDocument();
}
public Class<AccountDTO> getEncoderClass() {
return AccountDTO.class;
}
public AccountDTO decode(BsonReader reader, DecoderContext decoderContext) {
reader.readStartDocument();
String iBAN = reader.readString("IBAN");
String firstName = reader.readString("customerFirstName");
String lastName = reader.readString("customerLastName");
double balance = reader.readDouble("balance");
String currency = reader.readString("currency");
long customerId = reader.readInt64("customerId");
reader.readEndDocument();
Account account = new Account(iBAN, balance, currency);
Customer customer = new Customer(firstName, lastName, customerId, account);
AccountDTO doc = new AccountDTO(account, customer);
return doc;
}
}
编解码器提供者:
package utils;
import org.bson.codecs.Codec;
import org.bson.codecs.configuration.CodecProvider;
import org.bson.codecs.configuration.CodecRegistry;
import dto.AccountDTO;
class MyCodecProvider implements CodecProvider {
public <T> Codec<T> get(Class<T> myClass, CodecRegistry codecRegistry) {
if (myClass== AccountDTO.class) {
return (Codec<T>) new MyAccountDTOImpCodec(codecRegistry);
}
return null;
}
}
当使用JUnit 运行我的测试时,我得到了这个堆栈:
org.bson.codecs.configuration.CodecConfigurationException: Can't find a codec for class dto.AccountDTO.
我认为这是一个糟糕的实现,在Node.js 中我会发送我的json 对象,将java 对象发送给MongoDB 似乎很奇怪。
这只是对javadoc 的错误解释还是我的代码中缺少某种形式?
【问题讨论】:
标签: java mongodb mongodb-java