2

次のインターフェイスを備えたRESTfulWebサービスがあるとします。

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表現のリストが含まれます。

ジャージの場合、一般的な方法は、2つの単純なJavaPojoと1つの単純なリソースを定義することです。

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 に答える