在ResourceSupports中包含链接实体的片段

时间:2014-07-02 19:28:13

标签: java spring rest spring-hateoas

我正在尝试构建一个统一的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对象指向艺术家的页面吗?

1 个答案:

答案 0 :(得分:1)

HAL proposaldraft 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"
                }
            }
        }
    }
}