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:我沒有測試上面的代碼,但它應該給你一個想法

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());
? ? ? ? }
? ? }
}
添加回答
舉報