首页 文章

通过REST使用Morphia和MongoDB的JSON返回类型问题

提问于
浏览
0

我正在使用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 回答

  • 0

    你走在正确的轨道上 . 从 id 字段中删除 @Property 注释,因此它将如下所示:

    @Id
    private ObjectId id;
    

    然后,您只需要从 save 方法获取返回以检索密钥 . 下面的代码说明:

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

    现在它应该正常工作 .

  • 0

    所有,

    对于如何解决问题而言,这不是一个真正的答案,而是一种解决方法 .

    • 我正在使用 String id 而不是 ObjectId id

    • 在Object构造函数中,我创建了一个新的ObjectId并将其分配给该字段 .

    • 在更新对象时,我重新分配String id以确保_id保持相同并更新对象而不是创建新对象 .

    对于结构性解决方案,如果您拥有专业知识,请与evanchooly的建议一起使用......

    问候,

    SSG

  • 1

    我已经有一段时间了,但是我希望你需要为ObjectId编写de / serializer .

相关问题