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

时间:2015-01-27 22:26:11

标签: java spring spring-data-rest spring-hateoas

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

为了一个用例: Company 1是我系统中现有的Company。我想添加适用于Employee

的新Company 1

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

{
    "id": null,
    "firstName": "bZWthNFk",
    "lastName": "GtTnrqka",
    "loginId": "zTk5rT",
    "active": true,
    "_links": {
        "company": {
            "href": "http://localhost/companies/1";
        }
    }
}

然而,这似乎用于POST对象。根据我的理解,同一个对象必须张贴为:

{
    "id": null,
    "firstName": "bZWthNFk",
    "lastName": "GtTnrqka",
    "loginId": "zTk5rT",
    "active": true,
    "company": "http://localhost/companies/1"
}

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

如何构建一个有效的Java SDK进行服务到服务的通信,利用HATEOAS原则而不使用这个工具来实际可靠地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

1 个答案:

答案 0 :(得分:2)

如果您至少使用Spring Data REST 2.0版,那么您建议的方法应该可以正常工作。

您还应该拥有像http://app.com/employee/10/company这样的关联资源。您可以使用媒体类型PUT text/uri-list指向该位置的新链接,或使用EmployeeDELETE移除公司。

<强> UDATE

似乎我没有解决您的主要问题,您的更新和评论已澄清了这一点。因此,让我们将您的Employee类与Customer进行关联。

从您发布的JSON响应中可以看出,REST API使用的数据结构不包含Customer对象(在这种情况下为Company),只包含一个链接。客户端通常使用API​​定义的数据结构。所以customer首先是链接,不需要将对象序列化为链接。

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