我正在尝试构建一个统一的REST外观,它返回表示我的域资源的Spring HATEOAS ResourceSupport
类,使用@ResponseBody
表示JSON,使用Thymeleaf表示HTML。我有一个Painting
类看起来像这样:
public class PaintingResource extends ResourceSupport {
private String title;
private Integer year;
// artist is a Link rel="artist"
}
对于Painting
的JSON和HTML呈现,我需要有一个艺术家信息的片段(例如,个人资料图片的名称和URL),但嵌入其中是没有意义的。整个ArtistResource
类,Link
不允许附加任何其他元数据。
我是否应该创建一个嵌套的Artist
类来保存代码段并在资源汇编程序中创建所有这些,或者是否有更惯用的方法将代码段网格化为PaintingResource
?如果我使用嵌套类,我应该只嵌入名称和URL值并使用单独的Link
对象指向艺术家的页面吗?
答案 0 :(得分:1)
HAL proposal(draft spec here)描述了我认为您正在寻找的解决方案 - 在“保留”_embedded
属性中的其他资源中的“嵌入式”资源。遵循此规范,您可以在其他资源中包含其他资源的完整或部分代码段。
Spring HATEOAS通过在您的配置中添加以下内容来支持HAL,我不确定它为您做的一切,但它会将ResourceSupport
的链接输出为_links
属性。
@EnableHypermediaSupport(type = EnableHypermediaSupport.HypermediaType.HAL)
这似乎没有针对嵌入式资源做任何特定的事情,但它很简单,可以使用
的属性来实现private Map<String, List<ResourceSummary>> _embedded;
在这种情况下,在您的PaintingResource
课程上。您可能希望在此添加ArtistResource
的某种摘要/摘要版本,但这将允许您包含它自己的链接以及您希望公开的属性集。所以在你的情况下
private Map<String, ArtistSummaryResource> _embedded;
请注意,根据提案_embedded
,值可以是对象,也可以是对象列表。我们选择始终在客户端中实现对象列表,以降低复杂性。
我希望你最终会得到以下内容:
{
"title": "Painting title",
"year": 2014,
"_links": {
"self": {
"href": "http://your.server.com/path/to/painting"
}
},
"_embedded": {
"artist": {
"name": "J Smith",
"_links": {
"self": {
"href": "http://your.server.com/path/to/artist"
}
}
}
}
}