我在我的GoogleAppEngine托管应用程序中使用Objectify作为数据访问层。
当我试图坚持地图时,问题出现了。我的bean看起来像这样:
@Entity
@Cached
class MyBean{
@Id
private Long id;
@Embedded
Map<String, String> parameters = new HashMap<String, String>();
public MyBean(){}
//getters and setters below
}
首先请注意,地图'参数'不是私有的,它抛出了一个JRE异常。 保存地图时一切顺利。从DataStore中检索它时失败。
我的解决方法是使用@Serialized注释。这只是一种解决方法,因为我想要实现的是使用GAE数据存储区的expando功能。
根据objectify doc我正在做正确的操作。
异常详情:
引起:java.lang.NullPointerException at com.googlecode.objectify.impl.Transmog.loadSingleValue(Transmog.java:364) 在 com.googlecode.objectify.impl.load.EmbeddedMapSetter.safeSet(EmbeddedMapSetter.java:65) 在 com.googlecode.objectify.impl.load.CollisionDetectingSetter.set(CollisionDetectingSetter.java:37) 在 com.googlecode.objectify.impl.Transmog.loadSingleValue(Transmog.java:359) 在com.googlecode.objectify.impl.Transmog.load(Transmog.java:340)at com.googlecode.objectify.impl.ConcreteEntityMetadata.toObject(ConcreteEntityMetadata.java:203) 在 com.googlecode.objectify.impl.QueryImpl $ ToObjectIterator.translate(QueryImpl.java:668) 在 com.googlecode.objectify.impl.QueryImpl $ ToObjectIterator.translate(QueryImpl.java:657) 在 com.googlecode.objectify.util.TranslatingIterator.next(TranslatingIterator.java:35)
答案 0 :(得分:4)
嵌入式地图在Objectify3中得不到很好的支持,不应该公开宣布。关于@Embedded Map的部分已从Objectify3文档中删除。
Objectify4广泛支持地图,包括这些expando风格的地图:
此外,还有一个@Mapify注释,可以让您获取正常的对象集合,选择一个属性作为键,并将其存储为Map。
不幸的是,Objectify4的文档目前还没有准备好。但是,源代码由多方主动使用。如果你觉得大胆,那就从树干上建造。
答案 1 :(得分:0)
我还建议使用Objectify 4 - 我升级了我的应用程序并发现它相当容易。我更喜欢支持Map类型的字段。
要回答这个问题,你不应该将@Embedded
放在只包含基元的数组上。因此,您无需在地图上指定@Embedded
,因为String在Google App Engine数据存储区中是原始的。