8

我正在使用 Goole App Engine 来构建我的 REST API,我已经将我的类标记为PersistenceCapable并且我定义了我的@PrimaryKey并且还标记为@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY),我已经有了 EndPoints生成。但是当我在终端窗口中键入 curl 命令以插入新实体或注册表时,它不起作用。这是代码:

 @PersistenceCapable(identityType = IdentityType.APPLICATION)
 class Student{
    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Long     id;
    private String   studentName;
    ....
    ....
    ....
}

这是来自本地服务器的 curl 命令和响应。当我尝试插入一个新实体时

curl -H 'Content-Type: application/json' -d'{"studentName": "myname"}' htto://localhost:8889/_ah/api/utp/v1/student

这是来自本地服务器的响应。

"error" : {
"message" : "javax.jdo.JDOFatalInternalException: El valor de llave dado para construir una identidad de SingleFieldIdentity de tipo \"class javax.jdo.identity.LongIdentity\" para la clase \"class com.alex.wserver.Student\" es nulo.\nNestedThrowables:\norg.datanucleus.exceptions.NucleusException: El valor de llave dado para construir una identidad de SingleFieldIdentity de tipo \"class javax.jdo.identity.LongIdentity\" para la clase \"class com.alex.wserver.Student\" es nulo."

我一直认为 id 是自动生成的插入的。但这并没有发生在这里。与一起插入 id 不同


  1. 我的课错了吗?
  2. 我的 POST/json 请求好吗?

提前致谢。

4

3 回答 3

8

我认为我已经找到了解决方案。似乎谷歌应用引擎(GAE)框架生成的每个端点都有一个简单的方法,每次有人试图插入或更新时检查一个持久实例,所以事实是每次我试图插入一个新的使用 curl/json 的学生没有为实例指定 de new id 它显示如下错误消息:

    "error": {
      "message": javax.jdo.JDOFatalInternalException: The key value passed to construct a
      SingleFieldIdentity type \ class javax.jdo.identity.LongIdentity \ for class \ class com.alex.wserver.Student \ is null. \ nNestedThrowables: \ norg.datanucleus.exceptions.NucleusException: the key value passed to construct a SingleFieldIdentity type \ class javax.jdo.identity.LongIdentity \ for class \ class com.alex . wserver.Student \ is null.

所以我已经解决了编辑我的端点类的问题,方法是检查新对象(由 curl 命令发送并包装的 json 格式)是否具有非空 id 值,甚至在检查对象之前是否已使用以下代码存储:

        if(student.getKey() != null){
            if (containsStudent(student)) {
                throw new EntityExistsException("Object already exists");
            }
        }
        mgr.makePersistent(student);

到目前为止,我还没有看到任何可以为我澄清这方面的文件。我还要补充一点,在试图弄清楚发生了什么之前,我花了很多时间阅读有关GAE的文档。


所有这一切让我觉得可能只是 GAE 文档不是最新的,或者我可能没有足够的搜索,所以如果有人知道的话。请让我知道并增加常识。谢谢@DataNucleus。

注意: “我所做的这个分叉不应被视为正确答案,它可能会将您带到您的应用程序的意外行为。”

于 2013-02-22T00:12:55.003 回答
1

问题在于自动生成的端点的 contains 方法。当 id 为 null 并且方法捕获异常 javax.jdo.JDOObjectNotFoundException 时,抛出的异常是 javax.jdo.JDOFatalInternalException。

永远不会捕获异常,您会收到错误消息。我不知道这是一个错误还是什么,但是在更新了 catch 语句以捕获两者之后,问题就解决了。

希望能帮助到你!

于 2014-07-15T19:11:16.953 回答
0

正如 AlexSanchez 在回答中所说,生成的端点代码需要在插入新身份时已经设置的主键。

虽然有些人可能将此视为错误,但其他人可能会将其视为一项功能,因为它需要客户端以某种方式生成密钥(例如,当密钥类型为字符串时,通过创建随机 uuid)。这样,客户端即使在离线时也可以创建完整的实体图,并在在线时将它们上传到服务器。

(我认为 Spine 框架就是这个想法的一个例子:http: //spinejs.com/。)

于 2013-05-26T12:00:14.803 回答