我们正在构建一个类似于 spring.io 指南“使用 REST 访问 JPA 数据”的 RESTful Web 服务。要重现下面的示例输出,只需将ManyToOne -Relation 添加到Person,如下所示:
// ...
@Entity
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String firstName;
private String lastName;
@ManyToOne
private Person father;
// getters and setters
}
添加一些示例数据后的 GET 请求会产生:
{
"firstName" : "Paul",
"lastName" : "Mustermann",
"_links" : {
"self" : {
"href" : "http://localhost:8080/people/1"
},
"father" : {
"href" : "http://localhost:8080/people/1/father"
}
}
}
但是,鉴于 Paul 的父亲存储的 ID 为 2,我们想要的结果将是其关系的规范 url:
// ...
"father" : {
"href" : "http://localhost:8080/people/2"
}
// ...
如果某些人的父亲为空,这当然会导致问题(好吧,这在这里没有多大意义......;)),但在这种情况下,我们根本不想在 JSON 中呈现链接。
我们已经尝试实现ResourceProcessor来实现这一点,但似乎在调用处理器时链接还没有填充。我们设法添加了指向所需规范 url 的附加链接,但未能修改后来添加的链接。
问题:是否有一种通用方法来自定义所有资源的链接生成?
为了阐明我们对规范 URL 的需求:我们使用 SproutCore Javascript 框架来访问 RESTful Web 服务。它使用“类似 ORM”的数据源抽象,我们已经为其实现了 Spring 生成的 JSON 输出的通用处理程序。当查询所有人时,我们需要向与其他人有 q 关系的 n 个人发送 n*(1+q) 个请求(而不仅仅是 n 个),以将它们同步到客户端数据源。这是因为默认的“非规范”链接绝对不包含有关正在设置的父亲或父亲 ID 的信息。似乎这会导致大量不必要的请求,如果初始响应首先包含更多信息,则可以轻松避免这些请求。
另一种解决方案是将父亲的 id 添加到关系中,例如:
"father" : {
"href" : "http://localhost:8080/people/1/father",
"id" : 2
}