使用方法使用 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
属性公开此类数据。