Java 枚举为带有DBref和spring数据mongo的映射的键

Java 枚举为带有DBref和spring数据mongo的映射的键,java,spring,spring-data-mongodb,Java,Spring,Spring Data Mongodb,我试图使用带有映射字段的spring数据Mongodb将映射到类的文档保存和检索到Mongodb中 以下是java中my objects的简化版本: 枚举: public enum MyEnum { VALUE1, VALUE2 } 以及要持久化的实体: public class Entity { @DBRef private Map<MyEnum, MySubEntity> mapField; public Entity(Map<MyEnum,

我试图使用带有映射字段的spring数据Mongodb将映射到类的文档保存和检索到Mongodb中

以下是java中my objects的简化版本: 枚举:

public enum MyEnum {
   VALUE1, VALUE2
}
以及要持久化的实体:

public class Entity {

  @DBRef    
  private Map<MyEnum, MySubEntity> mapField;

  public Entity(Map<MyEnum, MySubEntity> mapField){
      this.mapField = mapField;
  }
}
公共类实体{
@DBRef
私有地图地图场;
公共实体(地图映射字段){
this.mapField=mapField;
}
}
我有一个简单的存储库来保存和检索实体。保存后,将在MongoDB中正确创建文档

当我试图检索它时,问题就出现了。对象实体由存储库创建并返回,但任何访问或使用
mapField
字段的尝试都将失败,并出现错误:
“java.lang.String无法强制转换为MyEnum”
当使用java debugguer监视检索到的实体对象时,mapField字段似乎有字符串作为键,而不是MyEnum

我尝试注册此类型的自定义转换器,但未成功

我的问题是:我能做些什么来匹配我的用例,还是我的模型不受SpringDataMongoDB支持,我应该修改它

更新


问题似乎与在地图上使用@DBRef有关。我尝试过不使用它,并且正确检索实体。不知道为什么…

你是对的。MongoDb中的键应该是
String
类型。在添加到数据库之前,您可以创建转换器将密钥转换为字符串类型。对密钥使用
toString()
方法可能是一种解决方案


这是一个很好的解释,可能也是您问题的答案。

我只知道mongodb端的一个,您也可以使用
enum:[“VALUE1”、“VALUE2”]
。java中有
EnumMap
。谢谢,但我现在已经确认该映射可以用于enum和spring mongo数据。我只能假设他们在驱动程序上有自定义实现。我更新了我的问题以反映这一点。