Objectify - java.lang.IllegalStateException:嵌入式Map键必须是String / Enum / Key <! - ? - >类型,或者字段必须指定@Stringify

时间:2014-11-25 00:00:42

标签: java google-app-engine objectify

我有一个Objectify实体未能注册。

这是该课程的精简版:

@com.googlecode.objectify.annotation.Entity
public class Insight {
    @com.googlecode.objectify.annotation.Id long id;
    public Map<Date, Double> timeseries;
}

以下是我遇到的错误:

java.lang.IllegalStateException: Embedded Map keys must be of type String/Enum/Key<?> or field must specify @Stringify

我认为错误发生在Objectify注册​​期间:

class OfyService {
    static {
        factory().register(Insight.class);
    }

很难分辨,因为有很多堆栈跟踪,因为代码在静态块中。

2 个答案:

答案 0 :(得分:1)

Objectify不知道如何处理Date作为Map键。映射键变为属性名称,必须是字符串。因此,您需要创建一个实现DateStringifier接口的Stringifier类。这是微不足道的,但你有一些选择 - 你可以将你的日期字符串化为毫秒以来的时代或某种人类可读的格式。

答案 1 :(得分:0)

根据https://code.google.com/p/objectify-appengine/wiki/Entities#Maps,我必须以下列方式声明Map,因为Map的键不是String:

@Stringify(com.googlecode.objectify.stringifier.KeyStringifier.class)
public Map<Date, Double> timeseries;