2

我正在尝试构建一个统一的 REST 外观,它返回ResourceSupport代表我的域资源的 Spring HATEOAS 类,@ResponseBody用于 JSON 和 Thymeleaf 用于 HTML。我有一个Painting看起来像这样的类:

public class PaintingResource extends ResourceSupport {
    private String title;
    private Integer year;
    // artist is a Link rel="artist"
}

对于 的 JSON 和 HTML 渲染Painting,我需要提供艺术家信息的片段(例如,个人资料图片的名称和 URL),但是嵌入整个ArtistResource类没有意义,并且Link不允许附加任何其他元数据。

我应该创建一个嵌套Artist类来仅保存代码片段并在资源汇编器中创建所有这些,还是有更惯用的方法将代码片段网格化PaintingResource?如果我使用嵌套类,我应该只嵌入名称和 URL 值并使用单独的Link对象指向艺术家的页面吗?

4

1 回答 1

1

HAL 提案(此处的草案规范_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"
                }
            }
        }
    }
}
于 2014-07-03T11:10:14.633 回答