2017-03-13 95 views
3

在我們的REST-API中,我們需要具備多租戶功能。對於achiving此所有其餘控制器子類的公共REST控制器,其定義了一個請求映射前綴和如下暴露出一個模型屬性在@ModelAttribute註釋方法內自動記錄@PathVariable註釋參數

@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中得到很好的記錄。我使用GET映射爲路徑/{tenantKey}/api/foo記錄了一個端點。

我的問題是,{tenantKey}路徑變量沒有記錄在swagger-ui中作爲參數。在swagger參數部分根本不呈現。如果我向控制器方法添加一個字符串參數,用@PathVariable("tenantKey)註釋它一切都很好,但我不想在我的控制器方法中使用tenantKey參數,因爲已解析的租戶已作爲模型屬性提供。

所以我的問題是:有沒有辦法做到從@ModelAttriute註釋的方法ApiController記錄在此設置swagger-ui?

項目,安裝程序

  • 彈簧啓動(1.4.2)
  • springfox-swagger2(2.6.1)
  • springfox-招搖的UI(2.6.1)

回答

1

這當然是可能的。目前不支持方法的模型屬性。相反,你可以採取以下方法。

  1. 標記getTenant方法與@ApiIgnore(如果它得到的請求映射處理不知道。)
  2. 在你的檔案你可以tenantKey全局路徑變量添加(所有終點)。由於這是一個多租戶應用程序,它假設這適用於所有終端。
+0

感謝您的回答。我配置了一個全局路徑變量,這完全解決了我的問題。 Btw:'getTenant'方法不被視爲請求映射。它沒有以任何方式記錄,但這是我期望的行爲,因爲它只能在內部工作,並且不會對REST API產生任何影響。 –