2014-11-25 14 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

相關問題