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

时间:2017-03-13 12:14:47

标签: spring-boot swagger springfox

在我们的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

项目设置

  • Spring-Boot(1.4.2)
  • springfox-swagger2(2.6.1)
  • springfox-swagger-ui(2.6.1)

1 个答案:

答案 0 :(得分:1)

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

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