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 类型的某处,或者我在某处犯了一些非常根本的错误...

克。调查完成

  1. 尝试将私有 ObjectId id 更改为 _id:失败
  2. 尝试将 private @属性("id") 更改为“_id”:失败
  3. 尝试对已使用 GET 创建的对象进行简单查询:相同的行为
  4. 在 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;

现在它应该可以正常工作了。

全部,

这并不是关于如何解决问题的真正答案,而是一种解决方法。

  1. 我正在使用 String id 而不是 ObjectId id
  2. 在 Object 构造函数中,我创建了一个新的 ObjectId 并将其分配给该字段。
  3. 在更新对象时,我重新分配了 String id 以确保 _id 保持不变并且更新对象而不是创建新对象。

对于结构性解决方案,如果您有专业知识,请采纳 evachooly 的建议...

此致,

SSG