Автоматическое заполнение объектов-членов на основе _link при использовании API-интерфейсов на основе HAL с помощью RestTemplate

#json #spring #resttemplate #hateoas

#json #spring #resttemplate #ненависть

Вопрос:

Используя 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 on 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 resu<
}
  

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

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

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

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

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

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

Ответ №1:

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

Эта библиотека отвечает на часть «автоматического перехода по ссылке» :

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

Комментарии:

1. Действительно, похоже, что Bowman подходит для моей цели. В любом случае, тем временем я реализовал свое собственное решение, которое соответствует 100%. Совершенно уверен, что он не такой сложный или универсальный, как bowman, но я все равно собираюсь опубликовать его на GitHub, поскольку, возможно, это полезно. 🙂 Я добавлю еще один ответ, когда это произойдет.

Ответ №2:

Через некоторое время я закончил реализацию своего собственного решения моего первоначального вопроса (начиная с того, как баксбонг любезно указал на Боумена).

На случай, если есть кто-то еще с теми же потребностями, что и у меня, вы можете найти мою реализацию здесь:

https://github.com/ahuemmer/storesthal

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