2014-05-02 27 views
1

我遇到了一个似乎与memcache相关的错误。IllegalArgumentException - 密钥不完整 - 对象化

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) 

我试图坚持正在扩展以下,并有 @Parent重点SomeClass的目的;

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秒钟的实体(我猜这是超时?)和高竞争使得它炸掉的保存。 。

+0

你能分享一些代码或对象,你试图坚持。 –

+0

我已经添加了抽象对象,谢谢 – kengjoran

+0

这部分 public key getKey(){ return Key.create(this); } 是不需要的,因为Appengine会自己生成密钥。 –

回答

0

我想我已经发现的问题,它只是争夺。我已经重写了很多我的应用程序的验证 - 我在移民中间我现在让你知道

  • 这是的确,这个问题,我的决议是将这个实体从hi中删除erarchy并添加父母作为索引字段。