我正在使用Micronaut和MongoDB创建一个新的应用程序,并且遇到了一些问题。
起初,我继续并选择使用反应性驱动程序,但是由于某些出现的错误,我正在重构代码以使用阻塞代码。我已经实现了一个基本接口,该接口为db操作提供了合同,作为将MongoDocument类分组在一起的基本MongoDocument类:
public interface BaseCrudRepository<T extends BaseMongoDocument> {
default T save(T document) {
document.setCreatedAt(new Date());
getCollection().insertOne(document);
return document;
}
default T findOneAndDelete(Bson filter) {
return getCollection().findOneAndDelete(filter);
}
default Stream<T> list(Bson filter) {
return StreamSupport.stream(getCollection().find(filter, getType()).spliterator(), false);
}
default T findOneUsing(Bson filter) {
return getCollection().find(filter).first();
}
String getCollectionName();
T delete(T document);
MongoCollection<T> getCollection();
Class<T> getType();
}
基本的mongo文档类
@Data
public abstract class BaseMongoDocument implements Serializable {
private Date createdAt;
private Date updatedAt;
}
当我使用反应性驱动程序时,从数据库查询对象并获取映射到其特定类的对象没有问题。现在,我已切换回阻塞驱动程序,我将收到此错误:
org.bson.codecs.configuration.CodecConfigurationException: Can't find a codec for class fts.marketing.models.CampaignRun.
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.internal.operation.Operations.createFindOperation(Operations.java:141)
at com.mongodb.internal.operation.Operations.find(Operations.java:130)
at com.mongodb.internal.operation.SyncOperations.find(SyncOperations.java:85)
at com.mongodb.client.internal.FindIterableImpl.asReadOperation(FindIterableImpl.java:209)
at com.mongodb.client.internal.MongoIterableImpl.execute(MongoIterableImpl.java:132)
at com.mongodb.client.internal.MongoIterableImpl.iterator(MongoIterableImpl.java:86)
at com.mongodb.client.internal.MongoIterableImpl.iterator(MongoIterableImpl.java:39)
作为参考,我尝试保存的对象如下:
@Data
@EqualsAndHashCode(callSuper = true)
@MongoCollection("campaign_run")
public class CampaignRun extends BaseMongoDocument {
private String merchant;
private String campaignName;
private Long runId;
@JsonDeserialize(using = ZonedDateTimeDeserializer.class)
private ZonedDateTime timeScheduled;
private String lastEmailGenerated;
private String marketingServer;
private CampaignRunStatus status;
}
我正试图了解我遇到的错误,但我想不出任何解决方案。我无法理解为什么使用反应性驱动程序时不需要编解码器,而使用阻塞性驱动程序时却不需要编解码器。
getCollection
方法的实现正在积极使用其应表示的类
@Override
public MongoCollection<CampaignRun> getCollection() {
return mongoClient
.getDatabase(databaseName)
.getCollection(getCollectionName(), CampaignRun.class);
}
但是这不起作用。我曾尝试在网上寻找示例,但没有找到任何示例。谁能对此有所启发?
编辑:
经过一番挖掘,看来使用阻塞驱动程序会导致Micronaut不执行任何与编解码器相关的配置。使用反应性驱动程序AbstractReactiveMongoConfiguration
时,请小心自动注入可能发现为单例的编解码器。
对于阻塞驱动程序,情况并非如此。目前,我还不知道如何以全局统一的方式使用阻塞驱动程序来实现相同的行为。