首页 文章

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

提问于
浏览
7

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

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

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

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

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

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

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

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


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

public class Employee {
    private Integer id;
    @NotNull
    private Company company;
    private String firstName;
    private String lastName;
}

I've created the following improvement request in reference to this:

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

1 回答

  • 2

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

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

    UDATE

    看来我没有't address your main concern, that was clarified by your update and comments. So let'采取与 Customer 有关联的 Employee 类 .

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

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

相关问题