java - 带有 methodOn 的 Spring HATEOAS ControllerLinkBuilder

标签 java spring spring-mvc spring-hateoas

在使用 ControllerLinkBuildermethodOn 功能时,我不明白的一件事是,当您的 Controller 具有这样的方法签名时,您应该做什么:

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

所以每当我想使用 methodOn 时,我该如何填写 UserUpdateRequest 参数和 BindingResult 等空白(我使用绑定(bind)结果来使用 @ControllerAdvice 和 JSR 303 处理错误的请求异常,以使输出消息可读)。

当我希望使用开箱即用的 spring HATEOAS ControllerLinkBuilder 来更轻松地使用 methodOn 我最终会写这样的东西(请注意,我不知道这是否会不会适得其反,但代码看起来并不令人欣慰):

resource.add(linkTo(methodOn(UserController.class).update(userId, null, null)).withSelfRel());

当然,我可以省略 methodOn 部分,而只使用 linkTo,这将需要我在构建路径方面进行尝试。

只传递 null refs 是否合适?另外,使用 methodOn 是否方便,就好像您决定删除 say: BindingResult 或添加类似 HttpServletRequest 到 Controller 方法签名中,以便 spring如果出于某种安全原因我想记录 IP 地址,可以向我传递有关请求的更多信息。这需要我使用 methodOn 去更改链接构造部分。

另一个让我有点困惑的问题是,我将一个合法的 ref 传递给 methodOn,比如 userUpdateRequest 填充了数据 - 这些数据是否会通过生成的链接到达任何地方?我已经看到一些超媒体,其中包括您传递的 rel 和 href 正文 - Spring HATEOAS 是否有可能?创建准备好在其中发布/放入有效负载的链接是否是一种好习惯?

但是回到 ControllerLinkBuilder 仅使用 linkTo 方法构建与 .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 构建链接。

至于包含body:Spring HATEOAS的默认格式是HAL .它使用 _embedded 属性来公开此类数据。

关于java - 带有 methodOn 的 Spring HATEOAS ControllerLinkBuilder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29567069/

相关文章:

spring-mvc - 如何在 Spring MVC Controller 中动态设置内容类型(取决于请求参数的存在)?

java - 未应用elasticsearch jvm配置

java - 考虑到计算机组织,JVM 如何工作?

java - 有关在 Spring MVC 中使用 @ModelAttribute 注解方法参数的一些信息

java - Spring HandlerInterceptor 调用了两次

spring - Spring MVC requestmapping handler方法中的{id :. +}是什么意思?

java - Spring Boot 服务器端口

java - 数组打印出来有大空格?

java - 确定正确的 Spring Boot 启动器

java - 我应该把 beans.xml 内容放在哪里(Jdbc Connect with Spring-Eclipse Dynamic webapplication)