我目前正在使用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
引用之外,Bar
也可以被其他对象类型引用,所以我想在自己的URL层次结构中公开它们的表示,而不是将子资源放在单个Foo
的层次结构中。所以在我的例子中,我希望Foo
的XML表示看起来像:
<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
引用的每个Foo
的id,并构造一个放置在XML(或JSON)表示中的URL。 / p>
我的问题是:从一个ServerResource
子类中,是否有办法询问Application
另一个ServerResource
子类映射到哪个URL?如果可以,那么我可以使用getRootRef()
方法构建所需资源的完整路径。
我发现This thread from 2007几乎都在询问达成共识的完全相同的问题:
(1)似乎有点笨重,(2)似乎它有同样的问题,我们在资源级别不知道应用程序放置它的位置。此外,自6年前提出问题以来,现在可能有更好的解决方案。
我对Restlet和REST架构一般都很陌生,所以我很开放我可能会完全错误地解决这个问题,所以请随时告诉我。