2013-10-31 29 views
16

我使用的AppEngine雲終端和客體。我之前已經部署了這些端點,現在我正在更新它們,並且它不適用於Objectify。我已經搬到新機器上並運行最新的appengine 1.8.6。已經嘗試在classpath中添加objectify並且沒有工作。我知道這可以工作,我在想什麼?物化與雲端點

當運行endpoints.sh:

Error: Parameterized type 
    com.googlecode.objectify.Key<MyClass> not supported. 

更新: 我回到我的舊電腦,並在同一個端點跑endpoints.sh它工作得很好。舊機器有1.8.3。我正在使用物化3.1。

更新2: 更新我的舊機器1.8.6,並得到同樣的錯誤其它機器。葉2點的可能性: 1)端點不再支持物化3.1 2)端點有最新版本

最有可能的#1的錯誤......我一直更新到4.0反正。 ..

回答

18

由於物化的普及,在之前的版本中加入一種解決方法,以支持Key類型,直到一個更通用的解決方案是可用的。由於新解決方案可用,解決方法已被刪除。現在有兩種方法可以解決財產問題。

  1. 添加一個@ApiResourceProperty註釋,該註釋將導致在序列化過程中從對象中省略鍵。如果您想要一個簡單的解決方案並且不需要訪問客戶端中的密鑰,請使用此方法。
  2. 添加@ApiTransformer註解,提供了一個兼容機制序列化/反序列化領域。如果需要訪問客戶中的密鑰(或其代表),請使用此方法。由於這需要編寫一個變壓器類,所以比第一個選項更有效。
+0

嗨Dan,無關,我已經偶然發現了有關Google雲端點限制的問題,我想知道他們是否仍然存在,答案會很好http://stackoverflow.com/questions/19786339/google -cloud-endpoints-limits-any-proposed-solutions – ZiglioUK

+1

未來將在端點支持物化密鑰嗎? – Sti

+0

@Sti你的意思是爲Objectify Keys重新添加一個顯式處理程序?我不這麼認爲。通用的解決方案既解決了Objectify案件,又解決了其他問題。 –

6

我想出了我的項目如下解決方案:

​​

我知道,這是一個有點樣板,但嘿 - 它的工作原理,並增加了一些方便快捷的方法。

+1

您可以將@ApiResourceProperty移動到該字段以保存一些混亂 –

0

起初,我不明白的弗洛裏給出的答案,它確實是多麼有用。因爲其他人可能會受益,我會給出一個簡短的解釋。

如前所述,您可以使用@ApiTransformer定義變壓器類。這會將不可序列化的字段(如類型Key<myClass>)轉換爲其他字符,如Long

事實證明,當一個類由GCE處理時,將自動使用名爲get{fieldName}set{FieldName}的方法來轉換字段{fieldName}。在Google的文檔中,我無法在任何地方找到它。

這是我如何使用它的Key{Machine}財產在我Exercise類:

public class Exercise { 
    @ApiResourceProperty(ignored = AnnotationBoolean.TRUE) 
    public Key<Machine> machine; 
    // ... more properties 

    public Long getMachineId() { 
    return this.machine.getId(); 
    } 

    public void setMachineId(Long machineId) { 
    this.machine = new Key<Machine>(Machine.class, machineId); 
    } 

    // ... 
} 
0

其他已經提到如何與@ApiResourceProperty@ApiTransformer接近這一點。但我確實需要客戶端可用的密鑰,我不想爲每個客戶端都改變整個實體。我嘗試用com.google.appengine.api.datastore.Key替換Objectify Key,它看起來像我的情況很好,因爲這裏的問題主要是由於端點不支持參數化類型。