java - 使用 Micronaut 为 MongoDB 注册编解码器

标签 java mongodb micronaut

我正在使用 Micronaut 和 MongoDB 创建一个新的应用程序。关于我的一些数据库对象,我不得不陷入僵局。

我有一个包含枚举字段的对象,我需要将其转换为可以保存的值(我打算将其作为字符串保存)。

根据我的理解和收到的错误消息,我需要创建一个新的编解码器来处理这个问题(类似于 JPA 转换器)。虽然我找到了说明这一点的示例,但我对应该如何为 MongoClient 注册转换器感到有点困惑。

我正在使用框架和相应 MongoClient 的最新 Micronaut 版本。

下面是我得到的异常以供引用:

org.bson.codecs.configuration.CodecConfigurationException: Can't find a codec for class fts.marketing.models.CampaignEmailStatus.
    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.client.model.BuildersHelper.encodeValue(BuildersHelper.java:37)
    at com.mongodb.client.model.Filters$SimpleEncodingFilter.toBsonDocument(Filters.java:1109)
    at com.mongodb.client.model.Filters$AndFilter.toBsonDocument(Filters.java:946)
    at com.mongodb.internal.operation.Operations.createFindOperation(Operations.java:142)
    at com.mongodb.internal.operation.Operations.find(Operations.java:130)
    at com.mongodb.internal.operation.AsyncOperations.find(AsyncOperations.java:85)
    at com.mongodb.async.client.FindIterableImpl.createFindOperation(FindIterableImpl.java:229)
    at com.mongodb.async.client.FindIterableImpl.asAsyncReadOperation(FindIterableImpl.java:225)
    at com.mongodb.async.client.MongoIterableImpl.batchCursor(MongoIterableImpl.java:161)
    at com.mongodb.async.client.MongoIterableSubscription.requestInitialData(MongoIterableSubscription.java:46)
    at com.mongodb.async.client.AbstractSubscription.tryRequestInitialData(AbstractSubscription.java:151)
    at com.mongodb.async.client.AbstractSubscription.request(AbstractSubscription.java:84)
    at com.mongodb.reactivestreams.client.internal.ObservableToPublisher$1$1.request(ObservableToPublisher.java:50)
    at io.reactivex.internal.operators.flowable.FlowableToListSingle$ToListSubscriber.onSubscribe(FlowableToListSingle.java:84)
    at com.mongodb.reactivestreams.client.internal.ObservableToPublisher$1.onSubscribe(ObservableToPublisher.java:39)
    at com.mongodb.async.client.MongoIterableSubscription.<init>(MongoIterableSubscription.java:40)
    at com.mongodb.async.client.Observables$1.subscribe(Observables.java:47)
    at com.mongodb.reactivestreams.client.internal.ObservableToPublisher.subscribe(ObservableToPublisher.java:36)
    at com.mongodb.reactivestreams.client.internal.FindPublisherImpl.subscribe(FindPublisherImpl.java:189)

最佳答案

我认为用编解码器创建一个类并使其可注入(inject)就足够了:

@Singleton
public class EnumCodec implements Codec<CampaignEmailStatus> {

  @Override
  public CampaignEmailStatus decode(BsonReader reader, DecoderContext decoderContext) {
    String enumString = reader.readString();
    return CampaignEmailStatus.valueOf(enumString);
  }

  @Override
  public void encode(BsonWriter writer, CampaignEmailStatus value, EncoderContext encoderContext) {
    String enumString = value.name();
    writer.writeString(enumString);
  }

  @Override
  public Class<CampaignEmailStatus> getEncoderClass() {
    return CampaignEmailStatus.class;
  }
}

解释编解码器的 Mongo 驱动程序文档位于:https://mongodb.github.io/mongo-java-driver/3.11/bson/codecs/

编解码器的注入(inject)发生在这里

io.micronaut.configuration.mongo.reactive.DefaultReactiveMongoConfiguration#codecs

如果它不工作,你应该能够从那里调试它

PS:我没有测试上面的代码,但它应该给你一个想法

关于java - 使用 Micronaut 为 MongoDB 注册编解码器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57659579/

相关文章:

java - Spring数据查询示例

node.js - TypeError : this. add 不是 Node js应用程序中的函数

node.js - nodejs mongoose 批量更新

jdbc - Micronaut 数据 jdbc : saving an existing entity creates a new entity instead of updating the existing one

vert.x - Micronaut + Vertx + 测试容器

java - 我的探路者在寻找最短路径时遇到问题

java - 如何从 pc 将当前日期设置为 jDateChooser?

java - 如何使用 java String.replaceAll(string regex,string replacement) 来得到我想要的?

node.js - Node populatedb url 不起作用

kotlin - 找不到 protoc-gen-grpc-kotlin-1.0.0-windows-x86_64.exe (io.grpc :protoc-gen-grpc-kotlin:1. 0.0)