我正在使用jersey-quickstart-webapp(Glassfish,v2.22.1)为我的MongoDB数据库构建REST API .
应用程序服务器是Tomcat 8(在IntelliJ Idea中运行)和Morphia(v1.1.0) .
一个 . 我的组织课程如下......
@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
}
湾我的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 . POST执行后,MongoDB Collection中的数据看起来不错......
> db.orgs.find();
{ "_id" : ObjectId("56a9462902c3192d88d64bc3"), "type" : "", "name" : "My Organisation", "altName" : "", "shortName" : "", "parentId" : "" }
{ "_id" : ObjectId("56a9464b02c3192d8845d128"), "type" : "", "name" : "Ecosys Clover", "altName" : "", "shortName" : "", "parentId" : "" }
即一切都像魅力一样直到这里,SysOut打印出Org新创造的id ...
ds.save(org);
System.out.println("org name = " + org.getName() + ", id = " + org.getId()); // Prints the new Org ID perfectly fine!!!
F . 但是,当同一个Org作为POST调用的响应返回时,它不包含新ID!
{
"altName": "",
"id": {},
"levels": [],
"name": "My Organisation",
"parentId": "",
"shortName": "",
"type": ""
}
如果我在这里做错什么,请告诉我吗?由于从Org对象打印组织ID,似乎在DB中的插入,对组织对象Id(通过Morphia)的更新工作正常 . 可能问题出在返回类型的某个地方,或者我在某处犯了一些非常根本的错误......
G . 调查完成了
-
尝试将私有ObjectId id更改为_id:没有运气
-
尝试将私人@Property("id")更改为"_id":没有运气
-
尝试使用GET创建的对象的简单查询:相同的行为
-
在OrgResource.POST中更新Org的另一个字段,这确实反映在POST响应中!
感谢任何帮助,并提前感谢...
SG
3 回答
你走在正确的轨道上 . 从
id
字段中删除@Property
注释,因此它将如下所示:然后,您只需要从
save
方法获取返回以检索密钥 . 下面的代码说明:现在它应该正常工作 .
所有,
对于如何解决问题而言,这不是一个真正的答案,而是一种解决方法 .
我正在使用
String id
而不是ObjectId id
在Object构造函数中,我创建了一个新的ObjectId并将其分配给该字段 .
在更新对象时,我重新分配String id以确保_id保持相同并更新对象而不是创建新对象 .
对于结构性解决方案,如果您拥有专业知识,请与evanchooly的建议一起使用......
问候,
SSG
我已经有一段时间了,但是我希望你需要为ObjectId编写de / serializer .