对于我的模型,我在读取枚举属性时遇到问题。从mongodb读取后,属性'value'的类型为string而不是myenum。
我的型号:
public class Record {
@Id
public String id;
public Wrapper<MyEnum> wrappedEnum;
...
}
public class Wrapper<T extends Enum<?>> extends BaseWrapper<T>{
...
}
public class BaseWrapper<T> {
public T value;
...
}
代码:
Record record = new Record();
Wrapper<MyEnum> wrapper = new Wrapper<>();
wrapper.setValue(MyEnum.A);
record.setWrappedEnum(wrapper);
repository.save(record);
repository.findAll().forEach(rec -> {
Object value = rec.getWrappedEnum().value;
System.out.println("rec.getWrappedEnum().value: " + value); // rec.getWrappedEnum().value: A
System.out.println("rec.getWrappedEnum().getValue(): " + value.getClass()); // rec.getWrappedEnum().getValue(): class java.lang.String
MyEnum valEnum = rec.getWrappedEnum().getValue(); // throws Caused by: java.lang.ClassCastException: class java.lang.String cannot be cast to class com.example.MyEnum (java.lang.String is in module java.base of loader 'bootstrap'; com.example.MyEnum is in unnamed module of loader 'app')
});
是否有任何选项可以配置mongodb以正确读取此模型?
1条答案
按热度按时间tsm1rwdh1#
得到classcastexception的原因是,您没有指定持久层应该如何持久化 Package 的枚举。
我想您正在使用jpa作为持久性api。实际上有多种方法可以达到你想要的。对于您的案例来说,更方便的方法是注册一个转换器,以便jpa知道如何持久化枚举并将其Map回。一个基本的示例可以如下所示(注意,basewrapper中的value字段有setter):
注册转换器: