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