Spring boot 在@ModelAttribute注释的方法中自动记录@PathVariable注释的参数

Spring boot 在@ModelAttribute注释的方法中自动记录@PathVariable注释的参数,spring-boot,swagger,springfox,Spring Boot,Swagger,Springfox,在我们的REST-API中,我们需要具有多租户能力。为了实现这一点,所有rest控制器子类化了一个公共rest控制器,该控制器定义了一个请求映射前缀,并公开了一个模型属性,如下所示 @RequestMapping(path = "/{tenantKey}/api") public class ApiController { @ModelAttribute public Tenant getTenant(@PathVariable("tenantKey") String tenant

在我们的REST-API中,我们需要具有多租户能力。为了实现这一点,所有rest控制器子类化了一个公共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);
  }

}
@RestController
公共类FooController扩展了ApicController{
@RequestMapping(value=“/foo”,method=GET)
公共列表getFoo(@apignore@modeldattribute租户){
返回服务.getFoos(租户);
}
}
这个端点在swagger ui中得到了很好的记录。我使用路径
/{tenantKey}/api/foo
的get映射来记录端点

我的问题是,{tenantKey}path变量没有作为参数记录在swagger ui中。swagger中的参数部分根本不渲染。如果我向controller方法添加一个字符串参数,并用
@PathVariable(“tenantKey”)
对其进行注释,一切都很好,但我不希望在我的controller方法中使用
tenantKey
参数,因为解析的租户已作为model属性可用

所以我的问题是:有没有一种方法可以从
@modelatriute
中的
@ApiController
注释方法中获取
@PathVariable
,并在这个设置中记录在Swigger ui中

项目设置为

  • 弹簧靴(1.4.2)
  • springfox-Swagger 2(2.6.1)
  • springfox大摇大摆用户界面(2.6.1)

这当然是可能的。当前不支持方法上的模型属性。相反,您可以采取以下方法

  • 使用
    @apignore
    标记
    getTenant
    方法(不确定是否将其视为请求映射)
  • 在您的摘要中,您可以添加
    tenantKey
    全局路径变量(到所有端点)。由于这是一个多租户应用程序,因此假设它适用于所有端点

  • 谢谢你的回答。我配置了一个全局路径变量,这完美地解决了我的问题。顺便说一句:
    getTenant
    方法没有被视为请求映射。它没有以任何方式记录下来,但这是我所期望的行为,因为它只在内部工作,对REST API没有任何影响。