2017-03-13 7 views
3

REST-APIでは、マルチテナント対応が必要です。@ModelAttribute注釈付きメソッド内の@PathVariable注釈付きパラメータを自動的に文書化

@RestController 
public class FooController extends ApiController { 

    @RequestMapping(value = "/foo", method = GET) 
    public List<Foo> getFoo(@ApiIgnore @ModelAttribute Tenant tenant) { 
    return service.getFoos(tenant); 
    } 

} 
:これをachivingために、すべての残りのコントローラは、要求のマッピングのプレフィックスを定義し、次のように

@RequestMapping(path = "/{tenantKey}/api") 
public class ApiController { 

    @ModelAttribute 
    public Tenant getTenant(@PathVariable("tenantKey") String tenantKey) { 
    return repository.findByTenantKey(tenantKey); 
    } 

} 

派生コントローラはモデルを使用すると、彼らの要求マッピング方法で属性を作るモデル属性を公開し、共通のRESTコントローラをサブクラス化

このエンドポイントは、swagger-uiで十分に文書化されています。パス/{tenantKey}/api/fooのGETマッピングで文書化されたエンドポイントを取得します。

私の問題は、{tenantKey}パス変数がパラメータとしてswagger-uiに記録されていないことです。 swaggerのパラメータセクションはまったくレンダリングされません。コントローラメソッドにStringパラメータを追加すると、@PathVariable("tenantKey)でアノテーションを付けても問題ありませんが、コントローラメソッドにtenantKeyパラメータは不要です。解決済みのテナントはすでにモデル属性として使用可能なためです。

私の質問は:この設定でApiController@ModelAttriute注釈付きの方法から@PathVariableを取得する方法はありますか?

プロジェクトセットアップは

  • 春ブーツ(1.4.2)
  • springfox-swagger2である(2.6.1)
  • springfox-闊歩-UI(2.6.1)

答えて

1

これは確かに可能です。メソッドのモデル属性は現在サポートされていません。代わりに、あなたは次のアプローチをとることができます。

  1. マークとgetTenant方法@ApiIgnore(それが要求マッピングとして扱われますかどうかわからない。)あなたの整理で
  2. あなたが(すべてのエンドポイントに)tenantKeyグローバルパス変数を追加することができます。これはマルチテナントアプリなので、これはすべてのエンドポイントに適用されると想定しています。
+0

ご回答ありがとうございます。私はグローバルパス変数を設定し、これは私の問題を完全に解決します。 Btw: 'getTenant'メソッドは要求マッピングとして扱われません。これは何らかの形で文書化されることはありませんが、内部的にしか動作せず、REST APIに影響を与えないため、これは私が期待する動作です。 –

関連する問題