在弹簧支架控制器之间实施常用方法的最佳实践是什么?

问题描述 投票:1回答:3

我正在使用弹簧控制器来实现我的web api,我想将控制器之间的常用方法放在一个地方,因此可以在我的所有控制器中使用。

如果没有办法扩展@RestController注释,那么在父类BaseController中编写控制器公共方法并从中扩展我的所有控制器是一个好习惯吗?

java spring-boot annotations spring-restcontroller
3个回答
2
投票

您可以创建own stereotype/annotation,但如果您只想向控制器添加一些常用方法,那么这显然是一个开销。此外,您将使您的代码更少“春天标准”。我不认为你想要那个。

在父类BaseController中编写控制器公共方法并从中扩展我的所有控制器是一个好习惯吗?

我不认为这是一个不好的做法,但在某些情况下,我不想使用类继承控制器:

  • 公共代码看起来像逻辑,而控制器不应该执行逻辑而是委托。如果这些内容太多,请引入服务类并委托给它。
  • 如果控制器不共享一组公共字段/依赖/初始化,则使用提供常用方法的依赖类可能更清晰/最简单。创建类的层次结构以避免声明公共字段似乎太多并且是子类化滥用。
  • 您应该支持Spring AOP和ControllerAdvice在控制器中进行常规处理,以进行预/专业/处理和异常处理。

如果你不属于这些情况,那么你的控制器的抽象类看起来是个好主意。


0
投票

如果我理解正确,你要找的是service layer。它可用于存储您可能需要的所有业务逻辑和常用方法。您提取它们并将服务对象注入您的控制器。从那里,您只需从服务层调用您的方法,不要污染您的控制器。根据我的经验,这被认为是一种很好的做法。

如你所说,你可以为可以用于不同类型控制器的方法做的另一件事就是提取到Utility类。您可以使用可在整个应用程序中使用的静态方法填充此类。


0
投票

我的控制器需要通用功能,例如 - 检查传入请求的参数和 - 包括传出响应中的标头。

为了避免父/子控制器的样板互相调用,我利用了spring注释/钩子。

为了解析和验证请求参数,我去了一个控制器建议类的路径,并在其中使用@ModelAttribute注释一个方法 - 在路径方法之前调用spring,并且可以使用它来使模型中的对象可用。

为了在所有响应中包含标头,我使用自定义注释扩展ResponseBodyAdvice的路径,您可以使用控制器映射方法向控制器建议是否应该为该响应调用它。

这里的弱点是从控制器到响应的建议。我去了自定义注释控制器映射方法的路由,在请求中设置一个属性,以便以后在响应建议中使用(并记录注释方法应该这样做。)

© www.soinside.com 2019 - 2024. All rights reserved.