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插入在一起不同
提前致谢.
我认为我找到了解决方案.似乎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.
注意: "我做的这个分叉不应该被视为正确的答案,它可能会带你到应用程序的意外行为."
| 归档时间: |
|
| 查看次数: |
2348 次 |
| 最近记录: |