Spring Boot控制器路径扩展另一个路径。

5
我们有一个路径模式为:/{language}/{subsystem}/blah/blah 的应用程序。 这里的 languagesubsystem 变量将执行一些公共逻辑,并应用于所有100多个控制器。我想问一下,有没有一种方法可以定义一个集中的控制器来处理语言逻辑,另一个集中的控制器来处理子系统逻辑,并且所有其他控制器都从这些控制器“扩展”? 希望我表述清楚了。非常感谢,愉快的周末 :)

“/language” 是什么逻辑集?我不确定,但如果您只想删除相同类型 URL 的冗余调用,则可以使用类似于“nginx”的工具,这对于 URL 分流非常有帮助。 - Dhwanil Patel
1个回答

1
你可以考虑为你的应用程序编写一个自定义拦截器。该拦截器可以从URL路径中获取languagesubsystem部分,并在中心位置调用你的通用逻辑。
这种方法有一些需要仔细平衡的缺点:
  1. 它非常隐晦 - 人们可能会忽略你的拦截器已经生效,可能会感到惊讶
  2. 它将应用于所有传入请求 - 如果你希望跳过某些请求,则必须在拦截器内实现此逻辑。
个人而言,我会采取另一种方法,使用每个控制器方法上的@RequestMapping@PathVariable注解的组合来捕获languagesubsystem,并将通用逻辑放入辅助方法中。
@GetMapping("/{language}/{subsystem}/something")
public String doSomething(@PathVariable Language language, @PathVariable Subsystem subsystem) {
    LanguageSubsystemHelper.doSomething(language, subsystem);
    // ...
}

提供一个可用于所有控制器方法的助手,将重复最小化。这种方法的好处是:
  1. 您可以在何时使用或不使用常见逻辑时进行细粒度控制
  2. 它是显式的
  3. 您可以通过将路径变量绑定到枚举来自动验证 languagesubsystem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接