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

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

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

0
ahuemmer 19 Апр 2019 в 10:25

2 ответа

Лучший ответ