尝试通过api-explorer插入实体时出现“message”:“java.lang.NullPointerException”

时间:2013-02-23 17:42:07

标签: google-app-engine google-cloud-datastore google-api-client google-cloud-endpoints

我是appEngine的新手,我尝试了项目所需的简单事项: 我创建了简单的JDO类Image:

@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Image {

@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key key;

@Persistent
private Blob image;

@Persistent
private String type;

@Persistent
private String description;

public Key getKey() {
    return key;
}

public void setKey(Key key) {
    this.key = key;
}

public Blob getImage() {
    return image;
}

public void setImage(URL url) throws IOException {

    try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                url.openStream()));

        String line;
        StringBuffer stbf = new StringBuffer();

        while ((line = reader.readLine()) != null) {
            stbf.append(line);
        }
        image = new Blob(stbf.toString().getBytes());
        reader.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

成功创建和使用AppEngine的端点。 当我试图通过google-api-explorer将简单对象插入数据存储区时 https://developers.google.com/apis-explorer/?base=https://my-application.appspot.com/_ah/api#s/, 只需链接到图像和带有id和appID参数的密钥,我收到以下错误:

503 Service Unavailable

- Show headers -

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "backendError",
    "message": "java.lang.NullPointerException"
   }
  ],
  "code": 503,
  "message": "java.lang.NullPointerException"
 }
}

当我从Long类型更改密钥时,查询执行正常,我在数据存储中看到新实体。

除此之外,在Documentation中说“如果编码的密钥字段为空,则在保存对象时,该字段将填充系统生成的密钥”。但似乎没有钥匙就不接受它?

有人可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:6)

看一下生成的方法containsImage:

标准生成的代码不检查getKey()是否返回null。您需要包含以下内容:

if (image.getKey() == null) {
            return false;
}
在它执行getObjectById之前

答案 1 :(得分:0)

我一直试图解决这个问题。建议的答案是正确的。我想添加一个注释:这在GAE SDK或Eclipse插件中没有修复。即仍未检查null键。谢谢你的提示!抱歉,我无法添加评论,不知道为什么。