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

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

据我所知,提供了将复杂对象转换为正确 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";
        }
    }
}

但是,这似乎对 POSTing 对象起作用。据我了解,同一对象必须发布为:

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

据我所知,无论是 HATEOAS 还是 Data REST 项目都没有提供方法来生成 this 对象以发布到有效的基于 HAL 的服务,无论是通过 RestTemplate 或其他一些方式。事实上,如果不进行一些手动编码,我找不到任何方法轻松发布复杂对象。我的假设错了吗?

在没有此工具的情况下,如何为服务到服务通信构建有效的 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

最佳答案

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

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

更新

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

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

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

关于用于将复杂实体发布到 Spring Data REST/HATEOAS 服务的 Java 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28181201/

相关文章:

java 。线程执行顺序

java - Neo4j java遍历api对象映射

Java 后端 : REST, 通过 Google 登录进行身份验证,现在怎么办?

java - Spring mvc注解配置。升级spring 4.3.9报错404

spring-data-jpa - 覆盖 QuerydslPredicateExecutor 的 findAll() 方法

java - Spring数据分页和排序存储库,具有多个字段和日期

java - 使用 Spring Data Rest 为 Controller 和存储库提供相同的 url 映射

java - 从数据库中获取年份

java - Spring MVC 文件上传 - 客户端发送的请求在语法上不正确

java - 如何确保 @ExceptionHandler(Exception.class) 在 Spring Boot 中最后被调用?