Java Morphia Map/List基于泛型类型加载,但不从继承给定类型的子类加载



我一直在尝试保存和检索具有Map对象的实体,该对象接受String和父类类型。

例如,

public interface MorphiaInterfaceThing {
String returnsAString();
}

然后我会有一个实现MorphiaInterfaceThing的类。

@Embedded
public class MorphiaTest implements MorphiaInterfaceThing {
private String stringReturn = "Test"    
@Override
public String returnsAString() {
return stringReturn;
}
}

然后,我将拥有一个实体,该实体持有Map<字符串,接口示例>。

@Entity
public class SampleEntity {
@Embedded
private Map<String, InterfaceExample> map
public void test() {
map.put("TestKey", new MorphiaTest());
}
}

然后实例化该对象并运行SampleEntity#test()。保存实体时,使用Datastore#save(obj),它可以正常工作。它将实体保存到文档中。

然而,当我试图通过morphia从数据库中检索SampleEntity时,它抛出了java.lang.RuntimeException:org.mongoodb.morphia.maping.MappingException:没有可用的构造函数。

经过一点测试,比如从map<字符串,接口示例>映射<字符串,MorphiaTest>,我最终认为这个问题是由于morphia试图从给定的泛型类型(在本例中为MorphiaInterfaceThing)实例化,而不是从文档中存储的实际类类型(MorphiaTest)实例化。由于MorphiaInterfaceThing是一个接口,它没有构造函数,因此抛出异常。

我现在的问题是,我如何能够强制morphia调用存储在映射中、文档中的实际对象,而不是泛型类型本身(即方法、注释等)?如果这不可能,除了完成我试图做的事情(在这种情况下,存储某种具有父类泛型的映射),还有其他选择吗?

此外,我对吗啡有点陌生,所以任何关于吗啡的其他建议都将不胜感激!

您使用的是什么版本的morphia?如果您在@Embedded声明上传递useDiscriminator=true,它应该为morphia提供足够的信息来加载您的类型。

好吧,我终于得到了我想要的,只需要使用普通的ol‘mongodb驱动程序。我仍然不确定你应该如何做低于2.x的morphia。然而,在2.x以上,你应该能够使用evantholley的答案:

您使用的是morphia的哪个版本?如果您在@Embedded声明中传递useDiscriminator=true,它应该为morphia提供足够的信息来加载您的类型。

如果您无法使用morphia2.x及以下版本,您应该能够使用最新的驱动程序添加pojo。(我花了很长时间才意识到)这可以通过CodecRegistry和注册ClassModel并启用类模型的discriminator来完成。要保存和检索,可以使用MongoCollection<T>,其中T是要保存的对象。

供参考:http://mongodb.github.io/mongo-java-driver/3.9/bson/pojos/#properties-具有抽象或接口类型

最新更新