【问题标题】:Issue in JSON return type with Morphia & MongoDB via REST通过 REST 使用 Morphia 和 MongoDB 的 JSON 返回类型问题
【发布时间】:2016-01-27 23:42:40
【问题描述】:

我正在使用 jersey-quickstart-webapp(Glassfish,v2.22.1)为我的 MongoDB 数据库构建 REST API。

应用服务器是 Tomcat 8(在 IntelliJ Idea 中运行)和 Morphia (v1.1.0)。

一个。我的Org类如下...

@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。执行 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" : "" }

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。但是,当作为 POST 调用的响应返回相同的 Org 时,它不包含新 ID!!!

{
  "altName": "",
  "id": {},
  "levels": [],
  "name": "My Organisation",
  "parentId": "",
  "shortName": "",
  "type": ""
}

如果我在这里做错了什么,请告诉我?由于 Org ID 是从 Org Object 打印的,因此在 DB 中的插入,Org object Id 上的更新(通过 Morphia)似乎工作正常。可能问题出在返回类型的某个地方,或者我在某个地方犯了一些非常根本的错误......

g.调查完毕

  1. 尝试将私有 ObjectId id 更改为 _id:没有运气
  2. 尝试将私有 @Property("id") 更改为 "_id":没有运气
  3. 尝试对已使用 GET 创建的对象进行简单查询:行为相同
  4. 在 OrgResource.POST 中更新 Org 的另一个字段,这确实会反映在 POST 响应中!

提前感谢任何帮助和感谢...

SG

【问题讨论】:

    标签: json mongodb rest jersey-2.0 morphia


    【解决方案1】:

    全部,

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

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

    对于结构性解决方案,如果您有专业知识,请遵循 evanchooly 的建议...

    问候,

    SSG

    【讨论】:

      【解决方案2】:

      你在正确的轨道上。从id字段中删除@Propertyannotation,所以它会是这样的:

      @Id
      private ObjectId id;
      

      那么你只需要从save方法中获取返回值就可以取回密钥了。下面的代码说明:

      Key<Org> key = ds.save(org);
      org.setId(key.getId());
      return org;
      

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

      【讨论】:

      • Daniel,已尝试在 Property 注释和属性名称中更改为 id 和 _id。没有运气...
      • 添加新对象和更新 ID 正在发生,Morphia 和 MongoDB 之间没有任何问题。
      • return org 的返回不会包含 id。这是因为 _id 字段仅在到达 MongoDB 时才生成。如果您想返回 _id 字段(可以在您的班级中命名为 id),您需要查询 MongoDB 以将其取回。
      • Morphia 数据存储文档指出 Saved 对象将填充新的 _ID。我确实检查了源代码(基于 MongoDB Java 驱动程序)。 org.mongodb.morphia.DatastoreImpl 中的以下行确实返回了数据库集合中保存的实体。 return postSaveOperations(Collections.singletonList(entity), involvedObjects, dbColl).get(0); 现在,b 点的下一行。 ds.save(org) 之后是 Sysout 并且这也会打印组织 ID,因此我不认为这个问题专门针对 Morphia,但似乎是 Jersey 实施中的问题。
      • 我使用 Morphia 已经有一段时间了,所以我做了一些研究,你是对的。我更新了我的答案,我想现在它会像你想要的那样工作:)
      【解决方案3】:

      我已经有一段时间没有弄乱球衣了,但我希望你需要为 ObjectId 编写 de/serializer。

      【讨论】:

      • 埃文:ObjectId 是可序列化的。 ObjectId Sourcepublic final class ObjectId implements Comparable&lt;ObjectId&gt;, Serializable.
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-02
      • 2020-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-16
      • 1970-01-01
      相关资源
      最近更新 更多