亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 Micronaut 注冊 MongoDB 編解碼器

使用 Micronaut 注冊 MongoDB 編解碼器

BIG陽 2023-06-21 13:46:58
我正在使用 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)
查看完整描述

2 回答

?
互換的青春

TA貢獻1797條經驗 獲得超6個贊

我認為用編解碼器創建一個類并使其可注入應該足夠了:


@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;

? }

}

編解碼器的注入發生在這里

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

如果它不起作用,您應該能夠從那里對其進行調試

PS:我沒有測試上面的代碼,但它應該給你一個想法


查看完整回答
反對 回復 2023-06-21
?
Cats萌萌

TA貢獻1805條經驗 獲得超9個贊

MongoDB java 客戶端在處理枚舉方面不一致,并且仍未修復。

對于作為對象屬性出現的枚舉,有自動EnumPropertyCodecProvider編解碼器實現并且開箱即用。但是,如果您將 enum 與com.mongodb.client.model.Filters它一起使用則不起作用,并且最終會出現問題的例外情況。

為 Micronaut 注冊特定枚舉編解碼器的解決方案是有效的,但它需要為要處理的每個枚舉定義一個編解碼器 bean。這是適用于所有枚舉的更通用的解決方案:

@Singleton

public class EnumCodecRegistry implements CodecRegistry {


? ? @SuppressWarnings("unchecked")

? ? @Override

? ? public <T> Codec<T> get(Class<T> clazz) {

? ? ? ? if (Enum.class.isAssignableFrom(clazz)) {

? ? ? ? ? ? return new EnumCodec(clazz);

? ? ? ? }

? ? ? ? return null;

? ? }


? ? @Override

? ? public <T> Codec<T> get(Class<T> clazz, CodecRegistry registry) {

? ? ? ? return get(clazz);

? ? }


? ? private static class EnumCodec<T extends Enum<T>> implements Codec<T> {

? ? ? ? private final Class<T> clazz;


? ? ? ? EnumCodec(final Class<T> clazz) {

? ? ? ? ? ? this.clazz = clazz;

? ? ? ? }


? ? ? ? @Override

? ? ? ? public void encode(final BsonWriter writer, final T value, final EncoderContext encoderContext) {

? ? ? ? ? ? writer.writeString(value.name());

? ? ? ? }


? ? ? ? @Override

? ? ? ? public Class<T> getEncoderClass() {

? ? ? ? ? ? return clazz;

? ? ? ? }


? ? ? ? @Override

? ? ? ? public T decode(final BsonReader reader, final DecoderContext decoderContext) {

? ? ? ? ? ? return Enum.valueOf(clazz, reader.readString());

? ? ? ? }

? ? }


}


查看完整回答
反對 回復 2023-06-21
  • 2 回答
  • 0 關注
  • 187 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號