【问题标题】:What is the best practice for implementing common methods between spring rest controllers?在 spring rest 控制器之间实现常用方法的最佳实践是什么?
【发布时间】:2019-02-08 14:28:24
【问题描述】:

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

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

【问题讨论】:

  • 在这些方法真正属于控制器之前,拥有公共方法的父控制器并没有错,而不仅仅是一些应该移动到特殊类的Utils。

标签: java spring-boot annotations spring-restcontroller


【解决方案1】:

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

在 parent 中编写控制器常用方法是一种好习惯吗 类 BaseController 并从中扩展我所有的控制器?

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

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

如果您不属于这些情况,是的,为您的控制器创建一个抽象类看起来是个好主意。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 是的,服务层是业务逻辑的地方,但我正在寻找的是:例如,请求参数的自定义处理程序或控制器的一些实用程序功能,这些方法用于我所有的控制器
    • 对于实用程序函数,我建议将它们提取到一个包含静态方法的实用程序类中,这些方法可以完成您需要的任何操作。但是,我没有足够的经验可以肯定地说这是最佳实践。然而,据我了解,这并不令人不悦。
    【解决方案3】:

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

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

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

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

    对我来说,这里的弱点是从控制器与响应建议进行通信。 我采用了自定义带注释的控制器映射方法的路线,在请求中设置了一个属性,以便稍后在响应建议中使用(并记录带注释的方法应该这样做。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-12
      • 2018-04-28
      • 2012-04-06
      • 1970-01-01
      • 2010-09-09
      • 2018-03-20
      • 1970-01-01
      相关资源
      最近更新 更多