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());
}
}
}
添加回答
举报