Java 用于将复杂实体发布到 Spring 数据 REST / HATEOAS 服务的客户端

Java Client for POSTing complex entities to a Spring Data REST / HATEOAS service

据我所知,提供了将复杂对象转换为正确 HAL 格式的方法。这当然是在编组框架本身中的对象时利用的。 ResourceLink 个对象等

为了一个用例: 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;
}

我参考此创建了以下改进请求:

https://jira.spring.io/browse/SPR-12678

如果您至少使用 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.