JSON return 中的问题通过 REST 使用 Morphia & MongoDB 键入
Issue in JSON return type with Morphia & MongoDB via REST
我正在使用 jersey-quickstart-webapp(Glassfish,v2.22.1)为我的 MongoDB 数据库构建一个 REST API。
应用程序服务器是 Tomcat 8(运行 inside IntelliJ Idea)& Morphia (v1.1.0)。
一个。我的组织 class 如下...
@Entity(value = "orgs", noClassnameStored = true)
public class Org
{
@Id
@Property("id")
private ObjectId id;
private String name = null;
// Some other properties
// Getter/Setter for Object ID
public ObjectId getId(){return id;}
public void setId(ObjectId id){this.id = id;}
// Getter & Setter for name...
// the other Getter & Setter methods
}
b。我的 OrgResource(POST 方法)如下...
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Org createOrg(Org org)
{
Morphia morphia = new Morphia();
morphia.mapPackage("com.dgfx.entity");
try
{
Datastore ds = morphia.createDatastore(MongoDBHelper.getMongoClient(), "dgfx-admin");
ds.save(org);
System.out.println("org name = " + org.getName() + ", id = " + org.getId()); // Prints the new Org ID perfectly fine!!!
return org;
} catch (UnknownHostException e)
{
e.printStackTrace();
return null; //TODO: Better return type
}
}
c。 POST 请求(使用 Postman 和 ContentType:Application/JSON)...
{
"altName": "",
"levels": [],
"name": "My Organisation",
"parentId": "",
"shortName": "",
"type": ""
}
d. MongoDB 集合中的数据在执行 POST 后看起来不错...
> db.orgs.find();
{ "_id" : ObjectId("56a9462902c3192d88d64bc3"), "type" : "", "name" : "My Organisation", "altName" : "", "shortName" : "", "parentId" : "" }
{ "_id" : ObjectId("56a9464b02c3192d8845d128"), "type" : "", "name" : "Ecosys Clover", "altName" : "", "shortName" : "", "parentId" : "" }
e。直到这里一切都像魅力一样工作,SysOut 打印 Org 的新创建的 id...
ds.save(org);
System.out.println("org name = " + org.getName() + ", id = " + org.getId()); // Prints the new Org ID perfectly fine!!!
f。但是,当同一个组织被 return 编辑为 POST 调用的响应时,它不包含新 ID!!!
{
"altName": "",
"id": {},
"levels": [],
"name": "My Organisation",
"parentId": "",
"shortName": "",
"type": ""
}
如果我在这里做错了什么请告诉我?由于 Org ID 是从 Org 对象打印的,因此在 DB 中插入、更新 Org 对象 Id(通过 Morphia)似乎工作正常。可能问题出在 return 类型的某处,或者我在某处犯了一些非常根本的错误...
克。调查完成
- 尝试将私有 ObjectId id 更改为 _id:失败
- 尝试将 private @属性("id") 更改为“_id”:失败
- 尝试对已使用 GET 创建的对象进行简单查询:相同的行为
- 在 OrgResource.POST 中更新 Org 的另一个字段,这确实反映在 POST 响应中!
感谢任何帮助并提前致谢...
新加坡
我已经有一段时间没弄乱球衣了,但我希望您需要为 ObjectId 编写 de/serializer。
你走对了。从id
字段中删除@Property
注释,所以它会像这样:
@Id
private ObjectId id;
那你只需要从save
方法中得到return就可以取回密钥了。下面的代码说明:
Key<Org> key = ds.save(org);
org.setId(key.getId());
return org;
现在它应该可以正常工作了。
全部,
这并不是关于如何解决问题的真正答案,而是一种解决方法。
- 我正在使用
String id
而不是 ObjectId id
- 在 Object 构造函数中,我创建了一个新的 ObjectId 并将其分配给该字段。
- 在更新对象时,我重新分配了 String id 以确保 _id 保持不变并且更新对象而不是创建新对象。
对于结构性解决方案,如果您有专业知识,请采纳 evachooly 的建议...
此致,
SSG
我正在使用 jersey-quickstart-webapp(Glassfish,v2.22.1)为我的 MongoDB 数据库构建一个 REST API。
应用程序服务器是 Tomcat 8(运行 inside IntelliJ Idea)& Morphia (v1.1.0)。
一个。我的组织 class 如下...
@Entity(value = "orgs", noClassnameStored = true)
public class Org
{
@Id
@Property("id")
private ObjectId id;
private String name = null;
// Some other properties
// Getter/Setter for Object ID
public ObjectId getId(){return id;}
public void setId(ObjectId id){this.id = id;}
// Getter & Setter for name...
// the other Getter & Setter methods
}
b。我的 OrgResource(POST 方法)如下...
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Org createOrg(Org org)
{
Morphia morphia = new Morphia();
morphia.mapPackage("com.dgfx.entity");
try
{
Datastore ds = morphia.createDatastore(MongoDBHelper.getMongoClient(), "dgfx-admin");
ds.save(org);
System.out.println("org name = " + org.getName() + ", id = " + org.getId()); // Prints the new Org ID perfectly fine!!!
return org;
} catch (UnknownHostException e)
{
e.printStackTrace();
return null; //TODO: Better return type
}
}
c。 POST 请求(使用 Postman 和 ContentType:Application/JSON)...
{
"altName": "",
"levels": [],
"name": "My Organisation",
"parentId": "",
"shortName": "",
"type": ""
}
d. MongoDB 集合中的数据在执行 POST 后看起来不错...
> db.orgs.find();
{ "_id" : ObjectId("56a9462902c3192d88d64bc3"), "type" : "", "name" : "My Organisation", "altName" : "", "shortName" : "", "parentId" : "" }
{ "_id" : ObjectId("56a9464b02c3192d8845d128"), "type" : "", "name" : "Ecosys Clover", "altName" : "", "shortName" : "", "parentId" : "" }
e。直到这里一切都像魅力一样工作,SysOut 打印 Org 的新创建的 id...
ds.save(org);
System.out.println("org name = " + org.getName() + ", id = " + org.getId()); // Prints the new Org ID perfectly fine!!!
f。但是,当同一个组织被 return 编辑为 POST 调用的响应时,它不包含新 ID!!!
{
"altName": "",
"id": {},
"levels": [],
"name": "My Organisation",
"parentId": "",
"shortName": "",
"type": ""
}
如果我在这里做错了什么请告诉我?由于 Org ID 是从 Org 对象打印的,因此在 DB 中插入、更新 Org 对象 Id(通过 Morphia)似乎工作正常。可能问题出在 return 类型的某处,或者我在某处犯了一些非常根本的错误...
克。调查完成
- 尝试将私有 ObjectId id 更改为 _id:失败
- 尝试将 private @属性("id") 更改为“_id”:失败
- 尝试对已使用 GET 创建的对象进行简单查询:相同的行为
- 在 OrgResource.POST 中更新 Org 的另一个字段,这确实反映在 POST 响应中!
感谢任何帮助并提前致谢...
新加坡
我已经有一段时间没弄乱球衣了,但我希望您需要为 ObjectId 编写 de/serializer。
你走对了。从id
字段中删除@Property
注释,所以它会像这样:
@Id
private ObjectId id;
那你只需要从save
方法中得到return就可以取回密钥了。下面的代码说明:
Key<Org> key = ds.save(org);
org.setId(key.getId());
return org;
现在它应该可以正常工作了。
全部,
这并不是关于如何解决问题的真正答案,而是一种解决方法。
- 我正在使用
String id
而不是ObjectId id
- 在 Object 构造函数中,我创建了一个新的 ObjectId 并将其分配给该字段。
- 在更新对象时,我重新分配了 String id 以确保 _id 保持不变并且更新对象而不是创建新对象。
对于结构性解决方案,如果您有专业知识,请采纳 evachooly 的建议...
此致,
SSG