我试图了解如何在Spring HATEOAS中创建和修改链接。
例如,假设我有两个集合,一个在api / users,另一个在api / event。我想将用户api / user / 56与事件api / event / 21相关联。为了论证,这是多对多的 - 用户可以参加许多活动,一个活动可能有很多用户。
据我了解,这样做的另一种方法是使用URI作为主键,因此我可以将以下内容发布到api / user / 56 / events;
{
attends: "http://localhost:9090/api/event/21"
}
然后端点需要能够解析该URL并提取ID(在本例中为21)和控制器(EventController.class),以便我可以保留它。
问题1:这是在REST API方面处理Spring Hateoas中的关系的正确方法吗?
问题2:如何在控制器中将此URL解析为数据的可用句柄(例如对相应控制器/方法的引用,主键等)
研究
RestTemplate可用于从请求映射方法内的控制器请求数据,如此;
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<EventResource> response = restTemplate.getForEntity(attendsUrl, EventResource.class);
EventResource eventResource = response.getBody();
但是,我不相信eventResource应该返回一个Id字段作为数据的一部分 - 它不是很安静,这将在API上公开。一种方法是使参数&#34; includePK = true&#34;但这再一次感觉不对 - 它只是隐藏了这个问题。此外,服务器以这种方式向它自己的API发出请求的想法似乎很迂回。
更新
这里有一个未解决的问题https://github.com/spring-projects/spring-hateoas/issues/292。基于该问题的一些评论(由用户kevinconaway)松散地基于我创建了一个快速的util类,它提供了一个简单的解决方案:SpringHateoasUtils。解决方案归结为;
String mapping = DISCOVERER.getMapping(targetClass, targetMethod);
UriTemplate template = new UriTemplate(mapping);
//values is key/value map of parameters that the referenced method accepts
Map<String, String> values = uriTemplate.match(uri);
SpringHateoasUtils使这个稍微好一些,但它仍然觉得它应该是一个功能。我会在春季代码中寻找一些东西 - 当它明白发生了什么时,我会回答这个问题。
答案 0 :(得分:3)
看看这里的答案:
POSTing a @OneToMany sub-resource association in Spring Data REST
问题1)是的,这就是你发布链接/关系的方式。使用URI。
问题2)从客户的角度来看,资源的URI实际上是 IS 其ID。服务器在内部使用
自动将此URI解析为实际模型实例 org.springframework.data.rest.core.UriToEntityConverter.convert(...)