2015-04-17 62 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