在JAVA中处理复杂对象的最佳实践是什么?

时间:2017-01-12 09:11:09

标签: java hibernate dropwizard

我有一个复杂的类,里面有很多对象,当我做GET时,我想看到包含所有内部对象数据的完整对象,但是当我发布POST时,我只想为内部对象传递ID。

示例:

class ComplexObject {
    private InnerObject1 innerObject1;
    private InnerObject2 innerObject2;

    //setters and getters
}

当我执行GET时,我想要检索完整的JSON,这是最简单的部分,但是当我保存ComplexObject时,我想只传递innerObject1和innerObject2的id,而不是整个对象。

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:1)

您不应该使用Hibernate实体在REST调用中发送和接收数据。为此使用单独的对象 - 数据传输对象(DTO) - What is Data Transfer Object?。在您的情况下,它可能是ComplexObjectWithIds,其中只包含ID:

@POST
@Path("/complex-object")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response postComplexObject(ComplexObjectWithIds complexObjectWithIds)

ComplextObjectFull包含完整数据:

@GET
@Path("/complex-object")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public ComplextObjectFull getComplexObject()

答案 1 :(得分:0)

发布对象时,您可以解析发送的JSON,并通过控制器中的ID检索所需的对象,然后在那里重建对象并发送要创建的完整对象。

例如,假设您有一个 ObjectController ,并且在发布路线上您将构建一个复杂的JSON。

//Post request to this method
public void addObject(@RequestBody Object obj) {
    Object newObj = new Object(obj);

    //Get the full objects by id
    InnerObject innerObj = innerObjectService.findById(obj.innerObjectId);

    //Build the full new object
    newObj.setInnerObj(innerObj);

    //Create the object
    ...
 }