如何使用Spring HATEOAS发布和发布链接

And*_*ill 9 java rest spring hateoas spring-hateoas

我正在尝试了解如何在Spring HATEOAS中创建和修改链接.

例如,假设我有两个集合,一个在api/users,另一个在api/event.我想将用户api/user/56与事件api/event/21相关联.为了论证,这是多对多的 - 用户可以参加许多活动,一个活动可能有很多用户.

据我了解,这样做的另一种方法是使用URI作为主键,因此我可以将以下内容发布到api/user/56/events;

{
    attends: "http://localhost:9090/api/event/21"
}
Run Code Online (Sandbox Code Playgroud)

然后端点需要能够解析该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();
Run Code Online (Sandbox Code Playgroud)

但是我不相信eventResource应该返回一个Id字段作为数据的一部分 - 它不是很安静,这将在API上公开.一种方法是使参数"includePK = true",但这感觉不对 - 它只是隐藏了问题.此外,服务器以这种方式向它自己的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);
Run Code Online (Sandbox Code Playgroud)

SpringHateoasUtils使这个稍微好一点,但它仍然觉得它应该是一个功能.我将寻求在春季代码中得到一些东西 - 当它清楚地发生了什么时,我会回答这个问题.

Rob*_*ert 3

看看这里的答案:

在 Spring Data REST 中发布 @OneToMany 子资源关联

问题 1) 是的,这就是您发布链接/关系的方式。带有 URI。

问题2)从客户端的角度来看,资源的URI实际上就是它的ID。服务器在内部自动将此 URI 解析为实际的模型实例:

org.springframework.data.rest.core.UriToEntityConverter.convert(...)