简体   繁体   中英

Java Client for POSTing complex entities to a Spring Data REST / HATEOAS service

From what I can tell, there are provided means for converting a complex object to proper HAL format. This is of course leveraged in marshalling the objects in the framework itself. Resource and Link objects, etc.

For the sake of a use-case: Company 1 is an existing Company in my system. I want to add a new Employee that works for Company 1

Below is an example Employee object that you'd receive from a Spring Data REST based service. Spring HATEOAS also provides the means to construct these objects yourself.

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

However, this seems to not work for POSTing the object. As I understand it, that same object would have to be POSTed as:

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

As far as I can tell, there are no means provided by either the HATEOAS or Data REST project to produce this object for posting to a valid HAL based service, either via RestTemplate or some other means. In fact, I can't find any means of readily POSTing a complex object without some hand-marshalling. Am I wrong in assuming this?

How is one supposed to build out a valid Java SDK for service-to-service communication that leverages HATEOAS principles without this tooling to actually POST objects reliably?


Long story short, I want to post this object without having to hand serialize the URIs for associations.

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

The approach you suggested should actually work, provided you use at least version 2.0 of Spring Data REST.

You should also have an association resource like http://app.com/employee/10/company . You can PUT a new link to that location using the media type text/uri-list or remove the company from Employee with a DELETE .

UDATE

It seems I didn't address your main concern, that was clarified by your update and comments. So let's take your Employee class that has an association with a Customer .

As you can see from the JSON response you posted, the data structure that the REST API works with doesn't contain a Customer object (or Company in that case), only a link. A client would usually work with the data structure defined by the API. So customer would be link in the first place and there would be no need for serializing an object to a link.

If the client uses a different data structure internally, then some kind of conversion is necessary anyway. But the reason would be the different structure, not HAL or association links.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM