假设我有一个带有以下界面的宁静网络服务:
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表示的列表。
使用平针织物的常用方法是定义两个简单的java pojos和一个简单的资源:
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;
}
}
如何在上述场景中注入儿童骨灰盒/物体?有没有最佳做法?你是如何解决这个问题的?
感谢。
答案 0 :(得分:1)
在这种情况下,我宁愿像这样建立一个扩展的Parent类:
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;
}
}
这不是一个很好的方式。我对其他替代方案持开放态度......
答案 1 :(得分:0)
您不会将子ID存储在父对象中,而是将子列表存储为对象...
public class Parent {
private String id;
private String name;
private List<Child> children;
...
@JsonIgnore
public String getId()...
@JsonProperty
public String getUrn()...
}