使用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
端点的呼叫...
如果对于这两个问题都没有开箱即用的解决方案(至少我没有找到一个...),而我不得不写自己的问题,那很好!只是想确保我不会因为错过了东西而重新发明轮子...
非常感谢!
答案 0 :(得分:0)
您可以使用Bowman在JAVA中使用JSON + HAL资源。与this article所示的RestTemplate相比,该库大大简化了资源消耗。
该库回答“自动链接跟随”部分:
我们的客户是Spring HATEOAS和Jackson的包装,其中包括 JPA的影响。从远程检索对象将返回的代理 返回的对象(使用Javassist进行检测),其访问者可以 透明地进行进一步的远程服务调用 与它的HAL链接。这允许链接和内联关联到两者 在客户端模型中以相同的方式定义,并大大简化了 客户代码。
答案 1 :(得分:0)
过了一会儿,我已经完成了对原始问题的解决方案(开始之前,baxbong友好地将我指向鲍曼)。
万一其他人的需求与我的需求完全相同,您可以在这里找到我的实现方式:
https://github.com/ahuemmer/storesthal
如此处所述,我将继续扩展它,因为有一些需求(由我或他人)。 :)当然,每个人都可以随意提出问题或提出要求!