2014-11-25 41 views
0

我有一个Objectify实体未能注册。Objectify - java.lang.IllegalStateException:嵌入式Map键必须是String/Enum/Key类型<?>或字段必须指定@Stringify

下面是类的精简版本:

@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 

我认为错误是物化在注册过程中发生的:

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

虽然很难说,因为有很多堆栈跟踪,因为代码是在stat ic块。

回答

1

客体不知道如何处理一个日期作为Map键做。地图键变成属性名称,它必须是字符串。所以你需要发明一个实现了Stringifier接口的类DateStringifier。这是微不足道的,但你有一些选择 - 你可以将你的日期划分为毫秒以上的时代或者某种人类可读的格式。

0

https://code.google.com/p/objectify-appengine/wiki/Entities#Maps,我必须按以下方式申报的地图,因为地图的关键不是一个字符串:

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

这不可能解决问题 - 它只会延迟问题,直到您真正尝试使用它。 'KeyStringifier'串化键,而不是日期。 – stickfigure 2014-11-25 21:26:19

+0

感谢@stickfigure,我认为它解决了这个问题,因为我通过了'java.lang.IllegalStateException'。但是我的代码仍然不起作用。我不确定我看到的问题是否是您预期的问题,但我正在尝试查询我的对象,即使我在数据存储中看到它,也没有找到它。这可能是最终一致性的结果。我不是通过'timeseries'字段查询我的'Insight'对象,而是通过其他字段来查询,它只是找不到'Insight'。这是否是延迟问题直到我尝试使用它的含义的例子? – 2014-11-25 22:03:48

+0

当您尝试保存()该字段时,您应该得到一个ClassCastException。 – stickfigure 2014-11-26 19:42:41

相关问题