我正在使用弹簧控制器来实现我的web api,我想将控制器之间的常用方法放在一个地方,因此可以在我的所有控制器中使用。
如果没有办法扩展@RestController
注释,那么在父类BaseController
中编写控制器公共方法并从中扩展我的所有控制器是一个好习惯吗?
您可以创建own stereotype/annotation,但如果您只想向控制器添加一些常用方法,那么这显然是一个开销。此外,您将使您的代码更少“春天标准”。我不认为你想要那个。
在父类BaseController中编写控制器公共方法并从中扩展我的所有控制器是一个好习惯吗?
我不认为这是一个不好的做法,但在某些情况下,我不想使用类继承控制器:
如果你不属于这些情况,那么你的控制器的抽象类看起来是个好主意。
如果我理解正确,你要找的是service layer。它可用于存储您可能需要的所有业务逻辑和常用方法。您提取它们并将服务对象注入您的控制器。从那里,您只需从服务层调用您的方法,不要污染您的控制器。根据我的经验,这被认为是一种很好的做法。
如你所说,你可以为可以用于不同类型控制器的方法做的另一件事就是提取到Utility类。您可以使用可在整个应用程序中使用的静态方法填充此类。
我的控制器需要通用功能,例如 - 检查传入请求的参数和 - 包括传出响应中的标头。
为了避免父/子控制器的样板互相调用,我利用了spring注释/钩子。
为了解析和验证请求参数,我去了一个控制器建议类的路径,并在其中使用@ModelAttribute注释一个方法 - 在路径方法之前调用spring,并且可以使用它来使模型中的对象可用。
为了在所有响应中包含标头,我使用自定义注释扩展ResponseBodyAdvice的路径,您可以使用控制器映射方法向控制器建议是否应该为该响应调用它。
这里的弱点是从控制器到响应的建议。我去了自定义注释控制器映射方法的路由,在请求中设置一个属性,以便以后在响应建议中使用(并记录注释方法应该这样做。)