当前位置: 首页 > 知识库问答 >
问题:

带有方法的Spring HATEOAS控制器LinkBuilder

马正初
2023-03-14

当将ControllerLinkBuilder与methodOn功能一起使用时,我不明白的一件事是,当您的控制器具有这样的方法签名时,您应该怎么做:

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

因此,每当我希望使用methodOn时,我应该如何填补UserUpdateRequest参数和BindingResult之类的空白(我使用binding result来处理@ControllerAdvice和JSR 303的错误请求异常,以使输出消息具有可读性)。

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

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

当然,我可以省略methodOn部分,只使用linkTo,这将需要我构建路径。

只传递空引用是否合适?另外,如果您决定删除methodOn,比如:BindingResult,或者向控制器方法签名添加类似于HttpServletRequest的内容,那么spring可以向我传递有关请求的更多信息,如果我出于某种安全原因想记录IP地址的话。这将需要我去改变链接建设部分使用methodOn。

另一个让我有点困惑的问题是,假设我将一个合法的ref传递给方法,比如充满数据的userUpdateRequest——这些数据应该随生成的链接一起去任何地方吗?我见过一些超媒体,其中包括rel和href你传递的内容的主体——这在Spring HATEOAS中是可能的吗?创建准备好在其中发布/放置有效负载的链接是一种好的做法吗?

但是回到ControlllerLinkBuilder,只使用link To方法使用. slash("...")构建链接-它可能会降低维护成本吗?

在日常实践中,你会推荐什么,你对链接建设有什么看法?也许有人可以提供专业提示/建议。

谢谢你,

共有1个答案

申屠新觉
2023-03-14

如果构建路径不需要参数,则可以安全地将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()构建链接,而不是method On

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

 类似资料:
  • 问题内容: 为什么无法从另一个内部访问其他控制器方法呢? 像这样。 已编译 如果您不能这样做,那为什么不呢?我还应该怎么做… 问题答案: 最近几个小时遇到相同的问题。我使用了api / services文件夹。它可能不完全是您所需要的,但是它是一个选择。

  • 问题内容: 我正在用Swift开发iOS应用程序。 我想使用prepareForSegue函数将数据从视图发送到另一个视图。 但是,我的目标视图之前是导航控制器,因此它不起作用。 请问我该怎么做? 问题答案: 在访问目标导航控制器,然后在其顶部: 您可以从目标控制器访问其视图并传递数据。 在旧版本(现在已过时)的Swift和UIKit版本中,代码略有不同:

  • 我有一个spring-boot应用程序,它通过一个控制器公开了一个REST接口。这是我的控制器的一个例子: 我试图为这个类编写单元测试,并且我必须模拟处理器(因为处理需要很长时间,并且我试图在测试控制器行为时避免这一步)。请注意,为了这个问题,所提供的示例被简化了。

  • 问题内容: 有没有理由不将Controller映射为接口? 在所有的示例和问题中,我看到了周围的控制器,都是具体的类。是否有一个原因?我想将请求映射与实现分开。但是,当我尝试在具体类中获取a 作为参数时,我碰壁了。 我的Controller界面如下所示: And the implementing class: 该方法效果很好;在抛出一个异常 如果我将注释添加到具体类中,那么一切都会按预期工作,但是

  • 我一直在尝试使用: 使用此链接: 但我有一个错误: 当我换成: 是工作。我能做些什么来和日期一起工作? 谢啦

  • 我有两个控制器和。 在中,我有一个名为的方法。 如何在中访问此方法?