2

假设我有一个带有以下接口的宁静网络服务:

GET /some/parent

这将返回类似

[
    {
        urn: "/some/parent/1",
        name: "parent1",
        children: [ "/some/child1", "/some/child2" ]
    },
    {
        urn: "/some/parent/2",
        name: "parent2",
        children: [ "/some/child3", "/some/child4" ]
    }
]

而且,我有

GET /some/parent/{id}

返回如下内容:

{
    urn: /some/parent/1,
    name: parent1,
    children: [
        {
            urn: "/some/child1",
            name: "child1"
        },
        {
            urn: "/some/child2",
            name: "child2"
        }
    ]
}

因此,当请求父母列表时,每个父母的 json 表示将与孩子骨灰盒一起列出。当请求特定的父资源时,json 表示将包含一个子 json 表示的列表。

使用 jersey 的常用方法是定义两个简单的 java pojo 和一个简单的资源:

public class Parent {
    private String id;
    private String name;
    private List<String> childIds;
    ...
    @JsonIgnore
    public String getId()...
    @JsonProperty
    public String getUrn()...
}

public class Child {
    private String id:
    private String name;
    ...
    @JsonIgnore
    public String getId()...
    @JsonProperty
    public String getUrn()...
}

@Path("/some/parent")
@Produces(MediaType.APPLICATION_JSON)
public class ParentResource() {
    @GET
    public List<Parent> findAll() {
        List<Parent> result = // some database query call
        return result;
    }

    @GET
    @Path("{id}")
    public Parent find(@PathParam("id") String id) {
        Parent parent = // some database call
        return parent;
    }
}

如何在上述情况下注入子骨灰盒/对象?有没有最佳实践?你如何解决这个问题?

谢谢。

4

2 回答 2

1

在这种情况下,我宁愿做一个像这样的扩展父类:

public class ParentExtended extends Parent {
    private List<Child> childrenObjects;

    public ParentExtended(Parent parent) {
        this.id = parent.getId();
        ...
    }

    @JsonProperty("children")
    public List<Child> getChildrenObjects() { ... }

    @Override
    @JsonIgnore
    public List<String> getChildren() { ... }
}


@Path("/some/parent")
@Produces(MediaType.APPLICATION_JSON)
public class ParentResource() {
    @GET
    public List<Parent> findAll() {
        List<Parent> result = // some database query call
        return result;
    }

    @GET
    @Path("{id}")
    public ParentExtended find(@PathParam("id") String id) {
        Parent parent = // some database call
        ParentExtended parentEx = new ParentExtended(parent);

        for (String childId : parent.getChildren()) {
            parentEx.getChildrenObjects().add(// fetch the child object);
        }
        return parentEx;
    }
}

这不是一个很好的方法。我对其他选择持开放态度...

于 2012-05-16T09:25:48.323 回答
0

您不会将子 ID 存储在父对象中,而是将子对象列表存储为对象...

public class Parent {
    private String id;
    private String name;
    private List<Child> children;
    ...
    @JsonIgnore
    public String getId()...
    @JsonProperty
    public String getUrn()...
}
于 2012-05-15T02:58:59.740 回答