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



我试图建立一个统一的REST外观,返回代表我的域资源的Spring HATEOAS ResourceSupport类,使用@ResponseBody为JSON和thymleaf为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对象指向艺术家的页面?

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

最新更新