在我们的REST-API中,我们需要具备多租户功能。为了实现这一点,所有其他控制器都是一个公共REST控制器的子类,它定义了一个请求映射前缀并公开了一个模型属性,如下所示
@RequestMapping(path = "/{tenantKey}/api")
public class ApiController {
@ModelAttribute
public Tenant getTenant(@PathVariable("tenantKey") String tenantKey) {
return repository.findByTenantKey(tenantKey);
}
}
派生控制器在其请求映射方法中使用模型属性:
@RestController
public class FooController extends ApiController {
@RequestMapping(value = "/foo", method = GET)
public List<Foo> getFoo(@ApiIgnore @ModelAttribute Tenant tenant) {
return service.getFoos(tenant);
}
}
这个端点在swagger-ui中得到了很好的记录。我得到一个端点,记录了路径/{tenantKey}/api/foo
的GET映射。
我的问题是,swagger-ui中没有记录{tenantKey}路径变量作为参数。 swagger中的参数部分根本不会呈现。如果我向控制器方法添加一个String参数,用@PathVariable("tenantKey)
注释一切都很好,但我不想在我的控制器方法中使用tenantKey
参数,因为已解析的租户已经可用模型属性。
所以我的问题是:在此设置中,有没有办法从swagger-ui中记录的@PathVariable
中的@ModelAttriute
注释方法中获取ApiController
?
项目设置
答案 0 :(得分:1)
这当然是可能的。目前不支持方法的模型属性。相反,您可以采取以下方法。
getTenant
标记@ApiIgnore
方法(不确定它是否被视为请求映射。)tenantKey
全局路径变量(到所有端点)。由于这是一个多租户应用程序,因此它假设这适用于所有端点。