#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
Как описано там, я продолжу и расширю его по мере необходимости (мной или другими). 🙂 Конечно, каждый может открывать проблемы или извлекать запросы!