使用 ControllerLinkBuilder 和 methodOn 功能时,我不明白的一件事是,当您的Controller具有如此方法签名时,您认为要做什么:
public HttpEntity<ResourceSupport> update(@PathVariable(USER_ID) Long userId, @Valid @RequestBody UserUpdateRequest userUpdateRequest, BindingResult bindingResult)
所以每当我想使用 methodOn 时,我如何填充像 UserUpdateRequest 参数和 BindingResult 这样的空白(我使用绑定结果来使用@ControllerAdvice和JSR 303处理错误的请求异常,使输出消息成为可读的。)
当我希望使用开箱即用的弹簧HATEOAS ControllerLinkBuilder 以便更轻松地使用 methodOn 我最终会写这样的东西(请注意我不知道这是否会没有适得其反,但代码看起来不舒服):
resource.add(linkTo(methodOn(UserController.class).update(userId, null, null)).withSelfRel());
当然,我可以省略 methodOn 部分,只需使用 linkTo ,然后需要我来构建路径。
传递 null 引用是否恰当?另外,使用 methodOn 如何方便,就像你决定删除say: BindingResult 或者将 HttpServletRequest 之类的东西添加到控制器方法签名中一样如果我想出于某些安全原因想记录IP地址,可以通过我更多关于请求的信息。这需要我使用 methodOn 来改变链接构造部分。
另一个令我难以置信的问题是,我将合法的参考传递给 methodOn ,例如 userUpdateRequest ,这些数据填充了数据 - 这些数据是否会随着生成的链接转移到任何地方?我已经看到一些超媒体包含rel和href你传递的内容 - 是否可以使用Spring HATEOAS,并且创建可以在其中发布/放置有效负载的链接是一个好习惯吗?
但回到 ControllerLinkBuilder 只使用 linkTo 方法构建 .slash链接(&#34; ...&#34;) - 维护成本可能更低吗?
在日常练习中,您会推荐什么?您对链接构建有何看法?也许有人可以提供专业的提示/建议。
谢谢,
答案 0 :(得分:4)
如果构建路径不需要参数,您可以安全地将null
传递给methodOn
。你可以通过&#34;真实&#34;数据仅作为构建路径所需的数据实际使用。
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
属性来公开此类数据。