生成自动Id IdGeneratorStrategy

AXS*_*XSM 8 java google-app-engine json curl jdo

我正在使用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;
    ....
    ....
    ....
}
Run Code Online (Sandbox Code Playgroud)

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

curl -H 'Content-Type: application/json' -d'{"studentName": "myname"}' htto://localhost:8889/_ah/api/utp/v1/student
Run Code Online (Sandbox Code Playgroud)

这是本地服务器的响应.

"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."
Run Code Online (Sandbox Code Playgroud)

我一直以为id是自动生成插入的.但这不会发生在这里.与将id插入在一起不同


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

提前致谢.

AXS*_*XSM 8

我认为我找到了解决方案.似乎Google App Engine(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.
Run Code Online (Sandbox Code Playgroud)

所以我通过检查新对象(由curl命令和包装的json格式发送)是否具有非null id值来解决编辑我的端点类的问题,甚至在检查该对象之前是否已存储此代码:

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

到目前为止,我还没有看到任何可以为我澄清这方面的文档.另外,我补充说,我花了很多时间阅读GAE上的文档,然后才弄清楚发生了什么.


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

注意: "我做的这个分叉不应该被视为正确的答案,它可能会带你到应用程序的意外行为."

  • 你好@ToyHunter,我做了一些研究,我找到了一个更好的解决方案.现在我正在使用包含一系列键的静态迭代器对象.因此每次我发布一个新实体时,我都会获得新对象的新密钥.我在Endpoint类中编写了一个初始化迭代器的私有静态方法,所以当我POST一个新对象时,迭代器得到一个新密钥,我只是将它分配给新对象并保留它.这里有一些[引用](https:/ /developers.google.com/appengine/docs/java/javadoc/com/google/appengine/api/datastore/KeyRange) (2认同)