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