据我所知,提供了将复杂对象转换为正确 HAL 格式的方法。这当然是在编码框架本身中的对象时利用的。 Resource
和Link
对象等
为了一个用例:
Company 1
是我系统中现有的 Company
。我想添加一个为 Company 1
Employee
下面是一个示例 Employee
对象,您将从基于 Spring Data REST 的服务接收到该对象。 Spring HATEOAS 还提供了自己构造这些对象的方法。
{
"id": null,
"firstName": "bZWthNFk",
"lastName": "GtTnrqka",
"loginId": "zTk5rT",
"active": true,
"_links": {
"company": {
"href": "http://localhost/companies/1";
}
}
}
但是,这似乎对 POSTing 对象不起作用。据我了解,同一对象必须发布为:
{
"id": null,
"firstName": "bZWthNFk",
"lastName": "GtTnrqka",
"loginId": "zTk5rT",
"active": true,
"company": "http://localhost/companies/1"
}
据我所知,无论是 HATEOAS 还是 Data REST 项目都没有提供方法来生成 this 对象以发布到有效的基于 HAL 的服务,无论是通过 RestTemplate
或其他一些方式。事实上,如果不进行一些手动编码,我找不到任何方法轻松发布复杂对象。我的假设错了吗?
在没有此工具的情况下,如何为服务到服务通信构建有效的 Java SDK,以利用 HATEOAS 原则来实际可靠地发布对象?
长话短说,我想发布这个对象,而不必手动序列化关联的 URI。
public class Employee {
private Integer id;
@NotNull
private Company company;
private String firstName;
private String lastName;
}
我已引用此创建了以下改进请求:
最佳答案
如果您至少使用 2.0 版的 Spring Data REST,您建议的方法应该实际有效。
您还应该有一个关联资源,例如 http://app.com/employee/10/company
。您可以使用媒体类型 text/uri-list
PUT
指向该位置的新链接,或者使用 从
。Employee
中删除公司删除
更新
我似乎没有解决您的主要问题,您的更新和评论已澄清了这一点。因此,让我们使用与 Customer
关联的 Employee
类。
正如您从发布的 JSON 响应中看到的那样,REST API 使用的数据结构不包含 Customer
对象(在这种情况下为 Company
), 只有一个链接。客户端通常会使用 API 定义的数据结构。因此 customer
将首先成为链接,并且不需要将对象序列化为链接。
如果客户端在内部使用不同的数据结构,则无论如何都需要进行某种转换。但原因可能是结构不同,而不是 HAL 或关联链接。
关于用于将复杂实体发布到 Spring Data REST/HATEOAS 服务的 Java 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28181201/