有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java IllegalArgumentException键不完整Objectify

我遇到了一个与memcache相关的bug

java.lang.IllegalArgumentException: Key is incomplete.
    at com.google.appengine.api.datastore.KeyFactory.keyToString(KeyFactory.java:164)
    at com.googlecode.objectify.cache.KeyMemcacheService.stringify(KeyMemcacheService.java:62)
    at com.googlecode.objectify.cache.KeyMemcacheService.putAll(KeyMemcacheService.java:91)
    at com.googlecode.objectify.cache.EntityMemcache.empty(EntityMemcache.java:319)
    at com.googlecode.objectify.cache.CachingAsyncDatastoreService$5.trigger(CachingAsyncDatastoreService.java:445)
    at com.googlecode.objectify.cache.TriggerFuture.isDone(TriggerFuture.java:89)
    at com.googlecode.objectify.cache.TriggerFuture.get(TriggerFuture.java:104)
    at com.googlecode.objectify.impl.ResultAdapter.now(ResultAdapter.java:34)
    at com.googlecode.objectify.util.ResultWrapper.translate(ResultWrapper.java:22)
    at com.googlecode.objectify.util.ResultWrapper.translate(ResultWrapper.java:10)
    at com.googlecode.objectify.util.ResultTranslator.nowUncached(ResultTranslator.java:21)
    at com.googlecode.objectify.util.ResultCache.now(ResultCache.java:30)
    at com.googlecode.objectify.util.ResultWrapper.translate(ResultWrapper.java:22)
    at com.googlecode.objectify.util.ResultWrapper.translate(ResultWrapper.java:10)
    at com.googlecode.objectify.util.ResultTranslator.nowUncached(ResultTranslator.java:21)
    at com.googlecode.objectify.util.ResultCache.now(ResultCache.java:30)

我试图持久化的对象扩展了以下内容,并且 @父关键字类

public abstract class AbstractVO<T> implements iVO<T> {
private static final Logger log = Logger.getLogger(AbstractVO.class.getName());

@Id
private Long id;

@Index
private Date lastModified;

public Long getId() {
    return id;
}

public Date getLastModified() {
    return lastModified;
}

public void setId(Long id) {
    this.id = id;
}

public void setLastModified(Date lastModified) {
    this.lastModified = lastModified;
}

public Key<?> getKey() {
    return Key.create(this);
}

@OnSave
public void onSaveFunction(){
    setLastModified(new Date());
}



@SuppressWarnings("unchecked")
public T save(){
    try {
        ofy().save().entity(this).now();
    } catch (IllegalArgumentException e){
        log.log(Level.SEVERE, "boom, key was incomplete", e);
    }
    return (T) this;
}

public Result<Void> delete(){
    return ofy().delete().entity(this);
}

@SuppressWarnings("unchecked")
public T refresh(){
    if (getId() != null){
        return (T) ofy().load().entity(this).now();
    }
    else {
        return (T) this;
    }
}

日志显示保存实体所需的数据与您期望的数据相同:

parent id:5813790675304448
parent key:ag5zfnRlY2gtZXNzZW5jZXJZCxIHQ29tcGFueRiAgIDAyK2fCAwLEghDYW1wYWlnbhiAgICA0pCXCwwLEgpBY3Rpb25UeXBlGICAgICS5-gJDAsSDFNlbGxlckFjdGlvbhiAgICAyvOpCgw
entity id: null

以前是否有人遇到过此问题?我如何解决此问题?我已经编写了测试用例,试图在我的开发服务器上重现,但它们都通过了。这似乎只是生产上的一个问题

编辑:

我已经删除了受影响实体上的缓存,这导致实体的保存需要10秒(我猜这是超时?)高争拗让它爆炸


共 (1) 个答案

  1. # 1 楼答案

    我想我已经发现了问题所在,那只是争论。。我已经重写了我的许多申请来核实——我现在正处于移民的中期,并会让你知道

    • 这确实是问题所在,我的解决方案是从层次结构中删除实体,并将父项添加为索引字段