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

bvu*_*laj 8 java spring spring-data-rest spring-hateoas

据我所知,提供了将复杂对象转换为适当的HAL格式的方法.这当然可以用于编组框架本身中的对象. ResourceLink物体等

对于一个用例的缘故: Company 1是现有的Company在我的系统.我想添加一个Employee适合的新功能Company 1

下面是Employee您从基于Spring Data REST的服务收到的示例对象.Spring HATEOAS还提供了自己构建这些对象的方法.

{
    "id": null,
    "firstName": "bZWthNFk",
    "lastName": "GtTnrqka",
    "loginId": "zTk5rT",
    "active": true,
    "_links": {
        "company": {
            "href": "http://localhost/companies/1";
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,这似乎不适用于POST对象.据我了解,同一个对象必须被POST为:

{
    "id": null,
    "firstName": "bZWthNFk",
    "lastName": "GtTnrqka",
    "loginId": "zTk5rT",
    "active": true,
    "company": "http://localhost/companies/1"
}
Run Code Online (Sandbox Code Playgroud)

据我所知,HATEOAS或Data REST项目无法通过或通过其他方式生成对象以发布到有效的基于HAL的服务RestTemplate.事实上,我找不到任何方法可以在没有手动编组的情况下轻松地发布复杂对象.假设这个我错了吗?

如何构建一个有效的Java SDK进行服务到服务通信,利用HATEOAS原则,而无需使用此工具实际POST对象?


长话短说,我想发布这个对象而不必手工序列化关联的URI.

public class Employee {
    private Integer id;
    @NotNull
    private Company company;
    private String firstName;
    private String lastName;
}
Run Code Online (Sandbox Code Playgroud)

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

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

a b*_*ver 2

如果您至少使用 Spring Data REST 2.0 版本,您建议的方法应该实际有效。

您还应该有一个协会资源,例如http://app.com/employee/10/company. 您可以PUT使用媒体类型创建指向该位置的新链接,text/uri-listEmployee使用DELETE.

数据更新日期

看来我没有解决您主要关心的问题,您的更新和评论已澄清了这一点。因此,让我们来看看EmployeeCustomer.

正如您从发布的 JSON 响应中看到的,REST API 使用的数据结构不包含对象Customer(或Company在这种情况下),仅包含链接。客户端通常会使用 API 定义的数据结构。因此,customer首先是链接,不需要将对象序列化为链接。

如果客户端在内部使用不同的数据结构,则无论如何都需要某种类型的转换。但原因是结构不同,而不是 HAL 或关联链接。