无法读取枚举属性classcastexception

avkwfej4  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(363)

对于我的模型,我在读取枚举属性时遇到问题。从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以正确读取此模型?

tsm1rwdh

tsm1rwdh1#

得到classcastexception的原因是,您没有指定持久层应该如何持久化 Package 的枚举。
我想您正在使用jpa作为持久性api。实际上有多种方法可以达到你想要的。对于您的案例来说,更方便的方法是注册一个转换器,以便jpa知道如何持久化枚举并将其Map回。一个基本的示例可以如下所示(注意,basewrapper中的value字段有setter):

@Converter
public class WrapperConverter implements AttributeConverter<Wrapper, String> {

  @Override
  public String convertToDatabaseColumn(Wrapper attribute) {
    return attribute.getValue().toString();
  }

  @Override
  public Wrapper convertToEntityAttribute(String dbData) {
    MyEnum myEnum = MyEnum.valueOf(dbData);
    Wrapper<MyEnum> wrappedEnum = new Wrapper<>();
    wrappedEnum.setValue(myEnum);
    return wrappedEnum;
  }
}

注册转换器:

@Entity
public class Record {
  @Id
  private String id;

  @Convert(converter = WrapperConverter.class)
  private Wrapper<MyEnum> wrappedEnum;

相关问题