2015-04-17 67 views
1

我正在開發一個帶有應用程序引擎的小型後端。現在我用不同的值多次保存一個實體後會出現一些奇怪的行爲。 我的代碼加載的實體是所有實體一樣的 - 每個實體獲得一個changeId所以我只能改變實體轉移到客戶端:App Engine:同一對象化查詢的不同結果

public class VersionableRecordHelper<T extends VersionableRecord> { 

final Class<T> clazz; 

public VersionableRecordHelper(Class<T> clazz) { 
    this.clazz = clazz; 
} 

Query<T> load() { 
    return ofy().load().type(clazz); 
} 

List<T> loadOrdered() { 
    return load().order("changeId").list(); 
} 

public List<T> loadOrdered(Long since) { 
    return since == null ? loadOrdered() : load().filter("changeId >", since).order("changeId").list(); 
} 

} 

的客戶則可以通過提供since查詢類的所有對象值。例如:

private final VersionableRecordHelper<Cat> helper 
    = new VersionableRecordHelper<>(Cat.class); 

// actually an @ApiMethod, simplified here 
public List<Cat> getCats(Long since) { 
    return helper.loadOrdered(since); 
} 

我的貓實體如下所示:

@Entity 
@Cache 
@JsonSerialize(include = JsonSerialize.Inclusion.ALWAYS) 
public class Cat extends VersionableRecord { 
    // some fields, getters, setters 
} 

public class VersionableRecord { 
    @Id 
    private String id; 

    @Index 
    private Long changeId; 

    // getters, setters and more 
} 

現在,如果我做since == 4相同REST請求,我得到完全不同的結果 - 有時changeId == 5,,但也與2,3或4 - 這應該不可能

我完全迷失在這裏。這是我檢查:

  • 我沒有在測試過程中更改記錄。事實上,我完全離開了超過90分鐘的記錄。
  • 我檢查到只有一個應用程序引擎實例正在運行。
  • 我試圖刷新內存緩存 - 但相同的2個ObjectifyCache鍵不停地四處移動。
  • memcache服務級別爲'共享'。
  • 我檢查了since的值不是空的任何機會。所以代碼肯定會被執行。
  • 當前我使用的是objectify版本5.0.3。從我的build.gradle:compile 'com.googlecode.objectify:objectify:5.0.3'
  • 我還相信實體通過檢查https://console.developers.google.com/project/project-id/datastore/query?authuser=0

有沒有人有一個有益的觀點在數據存儲中的正確changeId?我還檢查了不同類型的實體 - 相同的行爲。

+0

也許我只是說明顯而易見。但是,你確定當你進行REST調用時,你的代碼實際上正在被打擊,並且中間沒有http緩存給你返回錯誤的以前的值)? – Claudio

+0

嘿@Claudio - 不,絕對不是。我可以用'curl'實用程序調用它,但仍然會得到不同的結果。瀏覽器,捲曲,iOS應用程序 - 仍然一樣。 – mreichelt

+0

我發現如果我*手動關閉*我的實例,並讓一個新的自動啓動,一切按預期工作。但這不可能是解決方案。 ;) – mreichelt

回答

2

胡亂猜測,這是關係到FAQ#3:

https://code.google.com/p/objectify-appengine/wiki/FrequentlyAskedQuestions#Strange_things_are_showing_up_in_my_session_cache!_(or_missing_f

,或者當googlecode上死了,第三個向下:

https://github.com/objectify/objectify/wiki/FrequentlyAskedQuestions

你需要有ObjectifyFilter否則你會將會話數據泄露到後續請求中。升級到Objectify的更新版本;它會給你一個更明確的錯誤(代價是複雜的測試和遠程API的使用,但這是一個不同的故事)。

如果這不是你的問題,你需要更詳細地描述你的確切代碼。

+0

這是正確的答案 - 我錯過了將ObjectifyFilter添加到web.xml。感謝您的幫助! :)我現在看到,設置文檔明確指出,在https://github.com/objectify/objectify/wiki/Setup上啓用ObjectifyFilter - 但我相信這可能是設計成更好,更方便用戶,安全的方式。 – mreichelt

+0

Objectify的最新版本使得這是一個明顯的錯誤(以使Objectify的某些其他用法略微複雜爲代價)。請升級:) – stickfigure

+0

好吧,我升級到了Objectify 5.1.5!希望新版本按預期工作。再次感謝你的幫助! :) – mreichelt