在弹簧托控制器之间实现通用方法的最佳实践是什么?

时间:2019-02-08 14:28:24

标签: java spring-boot annotations spring-restcontroller

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

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

3 个答案:

答案 0 :(得分:2)

您可以创建自己的own stereotype/annotation,但是如果您只想向控制器添加一些通用方法,则显然很麻烦。此外,您将减少代码的“ Spring标准”。我不认为你想要那个。

  

在父级中编写控制器通用方法是否是一种好习惯?   类BaseController并从中扩展我的所有控制器?

我认为这不是一个坏习惯,但是在某些情况下,我不想为控制器使用类继承:

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

如果您不属于这些情况,可以的,为您的控制器设计一个抽象类是个好主意。

答案 1 :(得分:0)

如果我理解正确,那么您正在寻找的是service layer。它可以用来存储您可能需要的所有业务逻辑和通用方法。您提取它们并将服务对象注入到控制器中。从那里,您只需从服务层调用方法,就不会污染您的控制器。根据我的经验,这样做是一种好习惯。

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

答案 2 :(得分:0)

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

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

要解析和验证请求参数,我选择了 控制器建议类并在其中使用@ModelAttribute注释方法 -spring在路由方法之前调用 和 -可用于使对象在模型中可用。

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

对我而言,这里的弱点是从控制器传达响应的建议。 我采用了带有自定义注释的控制器映射方法的路线,该方法在请求中设置了一个属性,以供以后在响应建议中使用(并记录了应使用注释的方法。)