我目前正在使用 Restlet 提供一个 REST API 来访问具有许多相关表的数据库,使用 JPA + Hibernate 作为我的持久层。举一个具体的例子,假设我的 JPA 实体中有以下对象层次结构:
@Entity
class Foo {
Long id; // primary key
List<Bar> bars;
// Other Foo data
}
@Entity
class Bar {
public Long id;
// Bar data
}
除了被Foo
s 引用之外,Bar
s 还可以被其他对象类型引用,所以我想在它们自己的 URL 层次结构中公开它们的表示,而不是作为子资源放置在单个Foo
的层次结构中。因此,就我而言,我希望 a 的 XML 表示形式Foo
类似于:
<Foo>
<bars>
<Bar>http://example.com/bars/42</Bar>
<Bar>http://example.com/bars/127</Bar>
</bars>
<!-- Other foo data representation -->
</Foo>
在 Restlet 中,Router
为我的应用程序配置时,我有以下配置:
router.attach("/foo", ListAllFooResource.class);
router.attach("/foo/{id}", SingleFooResource.class);
router.attach("/bar", ListAllBarResource.class);
router.attach("/bar/{id}", SingleBarResource.class);
这就是我的困境所在。从资源级别来看,我似乎无法找到一种方法来确定SingleBarResource
放置的位置。当从我的 JPA 实体构造 Foo 的表示时,我想获取每个Bar
引用的 idFoo
并构造一个 URL 以放置在 XML(或 JSON)表示中。
我的问题是:在一个ServerResource
子类中,有没有办法询问另一个子类映射到Application
什么 URL ?ServerResource
如果可能,那么我可以使用该getRootRef()
方法构建所需资源的完整路径。
我发现这个线程从 2007 年开始提出几乎完全相同的问题,其中的共识是:
- 查询一些外部对象管理服务器资源的 URL 配置(使用 Spring 或类似的东西来提供配置和实例化)
- 一位 Restlet 开发人员建议在资源本身上放置一个静态或实例方法。
(1) 看起来有点笨拙,并且 (2) 似乎也有同样的问题,我们不知道应用程序在资源级别放置它的位置。此外,由于这个问题是 6 年前提出的,现在可能有更好的解决方案。
一般来说,我对 Restlet 和 REST 架构还是很陌生,所以我对我完全错误地处理这个问题的可能性持开放态度,所以请随时告诉我。