Автоматическое заполнение объектов-членов _link-ed при использовании API на основе HAL с RestTemplate - PullRequest
0 голосов
/ 19 апреля 2019

Используя Spring RestTemplate, я бы хотел использовать службу REST на основе HAL с упрощенной конфигурацией, подобной этой:

GET http://my.rest.service/items/123 возвращает

{
    "_links": {
        "category": {
            "href": "/categories/321"
        },
        "self": {
            "href": "/items/123"
        }
    },
    "name": "my wonderful item"
}

GET на http://my.rest.service/categories/321затем будет соответственно возвращать категорию, которой назначен мой элемент (которая выглядит очень похоже на JSON выше).

То, что я могу сделать до сих пор (и что работает :)), это какая-то «ручная» ссылка -следующее:

public Item getItemById(Integer itemId) {
    RestTemplate restTemplate = getRestTemplateWithHalMessageConverter();

    ResponseEntity<Resource<Budget>> response =
        restTemplate.exchange("http://my.rest.service/items/"+itemId,
            HttpMethod.GET, getHttpEntity(), 
            new ParameterizedTypeReference<Resource<Item>>() {}
        );

    ResponseEntity<Resource<Category>> catResponse =
        restTemplate.exchange("http://my.rest.service/" + 
            response.getBody().getLink("category").getHref(),
            HttpMethod.GET, getHttpEntity(), 
            new ParameterizedTypeReference<Resource<Category>>() {}
        );

    Item result = response.getBody().getContent();
    //^^ Now this is an item with NULL in category field

    result.setCategory(catResponse.getBody().getContent());
    //And voila, now the category is assigned

    return result;
}

(я не публиковал здесь «вспомогательные» функции, такие как getRestTemplateWithHalMessageConverter(), так как ИМХО они не имеют отношения к этому вопросу, тем более, что они работают, как ожидалось.)

Я хотел бы добиться «автоматического следования» за ссылками в ответе HAL и заполнения моих Java-объектов соответственно.

Итак, мой вопрос, есть ли способ получить «автоматический» _linkследующее, так что мой Item будет полностью заполнен без второго exchange и т. д.?Это простой пример, но у меня есть более сложные объекты со многими ссылками.Конечно, можно предположить, что соответствующие поля существуют в определенных классах.

И по вопросу бонуса;): Можно ли это использовать вместе с каким-то видом кэширования?Если бы у меня было 30 предметов с категорией 8, мне бы не хотелось иметь 30 звонков на конечную точку category ...

Если для обоих вопросов не существует готового решения (по крайней мере, я не нашел ...) и я должен написать свой собственный, я в порядке с этим!Просто хочу убедиться, что я не изобретаю велосипед заново только потому, что что-то пропустил ...

Спасибо большое !!

1 Ответ

0 голосов
/ 03 июля 2019

Вы можете использовать Bowman для использования ресурсов JSON + HAL в JAVA. Эта библиотека значительно упрощает потребление ресурсов по сравнению с RestTemplate, как показано в этой статье .

Эта библиотека отвечает на часть "автоматическая ссылка после":

Наш клиент обертка вокруг Spring HATEOAS и Джексона с тяжелым JPA влияние. При извлечении объекта с удаленного компьютера возвращается прокси возвращенный объект, инструментированный с помощью Javassist, чьи средства доступа могут прозрачно проводить дальнейшие вызовы удаленного обслуживания в соответствии со своими ссылками HAL. Это позволяет связать и встроенные ассоциации как быть определенным таким же образом в модели клиента и значительно упрощает код клиента.

...