我们有一个具有以下路径模式的应用程序:
/{language}/{subsystem}/blah/blahlanguagesubsystem变量将执行一些通用逻辑并适用于所有100+控制器,我想问一下,而不是在每个控制器中重复此通用逻辑100次,有没有办法定义一个集中式控制器,例如
/{language}
用来处理语言逻辑和另一个集中控制器,例如

/{subsystem}
哪个要处理子系统逻辑和所有其他控制器(从这些控制器中“扩展”)?
希望我能清楚地描述它。非常感谢,周末愉快:)

最佳答案

您可以考虑为您的应用程序编写custom Interceptor。该拦截器可以从您的URL路径中获取languagesubsystem部分,并在中央位置调用您的通用逻辑。

这种方法有一些陷阱,您应该仔细权衡:

  • 非常隐式-人们可能会错过您的拦截器到位并且可能会感到惊讶的
  • 将适用于所有传入请求-如果要跳过某些请求,则必须在拦截器
  • 中实现此逻辑

    就我个人而言,我将采用另一种方法,并在每种控制器方法上使用 @RequestMapping and @PathVariable 批注的组合,以捕获languagesubsystem并将通用逻辑放入辅助方法中:

    @GetMapping("/{language}/{subsystem}/something")
    public String doSomething(@PathVariable Language language, @PathVariable Subsystem subsystem) {
        LanguageSubsystemHelper.doSomething(language, subsystem);
        // ...
    }
    

    通过提供可用于所有控制器方法的助手,将重复的次数减至最少。这种方法的好处是:
  • 您可以精细控制何时使用或不使用常见逻辑
  • 这是显式的
  • ,您可以通过将路径变量绑定到枚举
  • 来自动验证languagesubsystem

    07-25 21:25