我们有一个具有如下路径模式的应用程序:
/{语言}/{子系统}/blah/blah
语言
和子系统
变量将执行一些通用逻辑并适用于所有100多个 Controller ,我想问的是而不是在每个 Controller 中重复这个通用逻辑100次,有没有办法定义像这样的集中 Controller
/{语言}
用于处理语言逻辑和另一个集中 Controller ,例如
和/{子系统}
哪个是处理子系统逻辑和所有其他 Controller 的“扩展”这些 Controller ? 希望我描述清楚。非常感谢,周末愉快:)
最佳答案
你可以考虑写一个custom Interceptor为您的应用程序。该拦截器可以从您的 URL 路径获取语言
和子系统
部分,并在中央位置调用您的通用逻辑。
这种方法有一些陷阱,您应该仔细权衡:
- 这是非常隐晦的 - 人们可能会错过你的拦截器已经就位,并且可能会带来惊喜
- 它将适用于所有传入请求 - 如果您希望它跳过某些请求,则必须在拦截器中实现此逻辑
就我个人而言,我会采取另一种方法并选择 @RequestMapping
and @PathVariable
的组合。每个 Controller 方法上的注释以捕获语言
和子系统
并将通用逻辑放入辅助方法中:
@GetMapping("/{language}/{subsystem}/something")
public String doSomething(@PathVariable Language language, @PathVariable Subsystem subsystem) {
LanguageSubsystemHelper.doSomething(language, subsystem);
// ...
}
通过提供可用于所有 Controller 方法的帮助器,将重复次数减少到最低限度。这种方法的好处是:
- 您可以精细控制何时使用或不使用通用逻辑
- 很明确
- 您可以通过将路径变量绑定(bind)到枚举来自动验证
语言
和子系统
关于java - Spring Boot Controller 路径扩展了另一条路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58991826/