Java客户端用于向Spring Data REST / HATEOAS服务POST复杂实体。

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

但是,似乎这种方法不适用于POST对象。据我了解,同样的对象必须以以下方式进行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个回答

2
您提出的方法应该是可行的,但需要使用至少2.0版本的Spring Data REST。
您还需要一个关联资源,例如http://app.com/employee/10/company。您可以使用媒体类型text/uri-list在该位置上放置一个新链接,或者使用DELETEEmployee中删除公司。
更新:
看起来我没有解决您的主要问题,这已经通过您的更新和评论得到澄清。那么我们来看看您的Employee类,它与Customer有关联。
正如您发布的JSON响应所示,REST API使用的数据结构不包含Customer对象(或在该情况下为Company),仅包含链接。客户端通常会使用API定义的数据结构。因此,customer首先是一个链接,无需将对象序列化为链接。
如果客户端在内部使用不同的数据结构,则仍然需要某种转换。但原因是不同的结构,而不是HAL或关联链接。

这完全有道理 :-) 我的后续问题是如果 Company 上有 NotNull 约束,那么您会如何处理这种情况? - bvulaj
@BrandonV 看起来你应该能够像你建议的那样发布一个对象,前提是你至少拥有Spring Data REST 2.0版本。 - a better oliver
所以你的意思是你有一个 Employee 实例,想要通过 RestTemplate 发送它,但你希望 Company 字段自动序列化?这意味着你有两个使用完全相同数据结构的 Java 应用程序。是这样吗? - a better oliver
即使不是完全相同的对象,您也希望Java客户端能够发布具有关系的复杂对象。手动完成任何操作似乎都很麻烦... - bvulaj
这很有道理,我明白其中的含义,只是很烦人 :)我的问题是,Spring HATEOAS 是否提供了一种更直观的方式来实际执行你所说的操作。如果接下来一两天没有其他关于实际执行此操作的评论,我可以将其标记为答案。 - bvulaj
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接