使用方法使用 ControllerLinkBuilder 时,我不了解的一件事功能是当 Controller 具有如下方法签名时您应该做什么:

public HttpEntity<ResourceSupport> update(@PathVariable(USER_ID) Long userId, @Valid @RequestBody UserUpdateRequest userUpdateRequest, BindingResult bindingResult)

因此,每当我希望在上使用方法时,如何填充 UserUpdateRequest 参数和 BindingResult 之类的空白(我使用绑定(bind)结果通过@ControllerAdvice和JSR 303处理不良请求异常,以使输出消息易于阅读)。

当我希望使用开箱即用的HATEOAS ControllerLinkBuilder 并通过方法更轻松地使用时,我最终会写出这样的内容(请注意,我不知道这样做是否会适得其反,但代码看起来并不令人欣慰):
resource.add(linkTo(methodOn(UserController.class).update(userId, null, null)).withSelfRel());

当然,我可以在
部分上省略方法,而只需使用链接到,这将需要我绕过构建路径。

仅传递引用是否合适?加上在
上使用方法的便利性,就像您决定删除说: BindingResult 或在 Controller 方法签名中添加诸如 HttpServletRequest 之类的东西,以便如果我想记录IP地址,spring可以将有关请求的更多信息传递给我出于安全原因。这将需要我使用 methodOn 来更改链接构建部分。

另一个让我感到困惑的问题是,我将合法引用传递给方法。我看过一些Hypermedia,其中包含rel和href以及您传递的内容-Spring HATEOAS是否可能,并且创建带有准备好在其中放置有效载荷的链接是一种好习惯吗?

但是,仅使用链接回到 ControllerLinkBuilder To可以使用 .slash(“...”)方法构建链接-是否可能会降低维护成本?

在日常练习中,您会推荐什么,您对链接构建有何看法?也许有人可以提供专业的提示/建议。

谢谢你,

最佳答案

如果不需要参数来构建路径,则可以安全地将null传递给methodOn。您可以传递“实际”数据,因为仅实际使用了构建路径所需的数据。
methodOn是一把双刃剑。一方面,它使您免于手动构建链接。因此不会有错误,并且如果您更改路径,所有链接仍将是正确的。另一方面,几乎可以肯定,您永远不会更改路径,但是正如您指出的,您可以更改方法的签名。在这种情况下,您也不得不更新链接构建代码,因为它不会以其他方式编译。您不能忘记更新,所以这是一件好事。但请考虑以下更改:

update(@ModelAttribute Integer otherId,
      @PathVariable(USER_ID) Long userId,
      @Valid @RequestBody UserUpdateRequest)
methodOn(UserController.class).update(userId, null, null)在语义上仍然是正确的,因此不会出现编译错误。但是,建立链接将失败。

恕我直言,最好的方法是像Spring Data REST一样,尽可能地依赖自动链接构建。您的API应该足够简单且一致,以至少提取大多数链接创建代码。然后将使用slash()而非methodOn构建链接。

至于包含主体:Spring HATEOAS的默认格式为HAL。它使用_embedded属性公开此类数据。

08-04 05:10