【问题标题】:Java Client for POSTing complex entities to a Spring Data REST / HATEOAS service用于将复杂实体发布到 Spring Data REST / HATEOAS 服务的 Java 客户端
【发布时间】:2023-03-23 16:04:02
【问题描述】:

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

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

下面是一个示例 Employee 对象,您将从基于 Spring Data REST 的服务接收到该对象。 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 项目都没有提供任何方法来生成 this 对象,以通过RestTemplate 或其他方式发布到有效的基于 HAL 的服务其他手段。事实上,我无法找到任何无需手动编组即可轻松发布复杂对象的方法。我的假设错了吗?

应该如何构建一个有效的 Java SDK 用于服务到服务的通信,利用 HATEOAS 原则,而无需此工具来实际可靠地发布对象?


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

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

我已为此创建了以下改进请求:

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

【问题讨论】:

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


    【解决方案1】:

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

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

    UDATE

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

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

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

    【讨论】:

    • 这完全有道理 :-) 我的后续工作是询问在公司存在 NotNull 约束的情况下您将如何处理这种情况?
    • @BrandonV @BrandonV seems 如果您至少拥有 Spring Data REST 2.0 版,您实际上应该能够发布您建议的对象。
    • 是的,我知道实际上有很多工作,尽管您对关联资源的建议也很酷。我的担忧与 Spring HATEOAS 提供的以这种方式与基于 HAL 的服务交互的工具有关。手动执行此操作,或编写我自己的封送处理程序来处理常见情况似乎有点不直观。
    • 所以你的意思是你有一个Employee 实例并想通过RestTemplate 发送它,但是你会自动序列化Company 字段?这意味着您有两个 Java 应用程序使用完全相同的数据结构。对吗?
    • 这里的具体情况是使用 MockMvc 发布(相同的应用程序),但我们暂时也可以假设您的示例。
    猜你喜欢
    • 1970-01-01
    • 2013-10-30
    • 2018-07-23
    • 2017-03-07
    • 1970-01-01
    • 2019-02-06
    • 1970-01-01
    • 2013-10-31
    • 2014-03-07
    相关资源
    最近更新 更多