【问题标题】:Can't get Entity from Datastore by Key无法通过密钥从数据存储中获取实体
【发布时间】:2014-07-16 11:00:23
【问题描述】:

我正在尝试通过密钥访问获取实体,但每次尝试获取它时都会遇到异常。

    datastore.put(en);
    String key = en.getKey();

然后将密钥作为字符串发送到另一个 servlet,例如 4644337115725824。当我尝试通过此代码获取实体时

    Key key = KeyFactory.createKey("User", req.getParameter("key"));
    Entity en = datastore.get(key);

在最后一行我有一个 EntityNotFoundException 并且“没有找到与键匹配的实体:用户(“4644337115725824”)' 怎么了?

【问题讨论】:

  • 确保key与Datastore中的key匹配,EntityNotFoundException仅在datastore中找不到匹配项时出现
  • Entity.getKey() 返回一个Key,而不是String,所以如果你想从Key中获取ID传递给你的其他servlet,你需要调用Key.getID()(对于Long ID)或Key.getName() 用于String ID。您在该实体的数据存储查看器中看到了什么?
  • 对不起,我忘了告诉当发送密钥时,会调用 Key.getID(),并且只发送 ID。但我认为,() 之间的字符串有问题,因为 Key.toString() 返回的是 Kind(number),而不是 Kind("number"),正如您在 Exception 消息中看到的那样。

标签: java google-app-engine google-cloud-datastore


【解决方案1】:

我认为您的密钥可能存在序列化/反序列化问题。要将密钥序列化为网络安全字符串,请使用KeyFactory.keyToString(key)

Key key = entity.getKey();
String serializedKey = KeyFactory.keyToString(key);

稍后,当您想反序列化另一个 servlet 上的密钥时,可以使用KeyFactory.stringToKey(string)

Key deserializedKey = KeyFactory.stringToKey(serializedKey);
Entity en = datastore.get(deserializedKey);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-26
    • 1970-01-01
    相关资源
    最近更新 更多