gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 11:17:07 24 4
gpt4 key购买 nike

我正在尝试构建一个统一的 REST facade,它返回代表我的域资源的 Spring HATEOAS ResourceSupport 类,对 JSON 使用 @ResponseBody,对 HTML 使用 Thymeleaf。我有一个看起来像这样的 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 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"
}
}
}
}
}

关于java - 在 ResourceSupports 中包含链接实体的片段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24539478/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com