使用RestTemplate

时间:2019-04-19 07:25:37

标签: json spring resttemplate hateoas

使用Spring RestTemplate,我想使用具有以下简化配置的基于HAL的REST服务:

GET http://my.rest.service/items/123返回

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

然后http://my.rest.service/categories/321上的GET将相应地返回分配给我的商品的类别(与上面的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端点的呼叫...

如果对于这两个问题都没有开箱即用的解决方案(至少我没有找到一个...),而我不得不写自己的问题,那很好!只是想确保我不会因为错过了东西而重新发明轮子...

非常感谢!

2 个答案:

答案 0 :(得分:0)

您可以使用Bowman在JAVA中使用JSON + HAL资源。与this article所示的RestTemplate相比,该库大大简化了资源消耗。

该库回答“自动链接跟随”部分:

  

我们的客户是Spring HATEOAS和Jackson的包装,其中包括   JPA的影响。从远程检索对象将返回的代理   返回的对象(使用Javassist进行检测),其访问者可以   透明地进行进一步的远程服务调用   与它的HAL链接。这允许链接和内联关联到两者   在客户端模型中以相同的方式定义,并大大简化了   客户代码。

答案 1 :(得分:0)

过了一会儿,我已经完成了对原始问题的解决方案(开始之前,baxbong友好地将我指向鲍曼)。

万一其他人的需求与我的需求完全相同,您可以在这里找到我的实现方式:

https://github.com/ahuemmer/storesthal

如此处所述,我将继续扩展它,因为有一些需求(由我或他人)。 :)当然,每个人都可以随意提出问题或提出要求!