2017-08-09 271 views
3

我有一個很簡單的問題:)如何使用swagger codegen爲動態feign basePath生成URI參數?

根據假裝文件,它們在改變佯客戶對象的基本路徑動態地通過傳遞URI參數支撐槽API函數like so

很好的例子:

interface MyClient { 
    @RequestLine("GET /internal-service") 
    String internalService(URI baseUrl); 
} 

事情是我使用的招搖,誰從YAML文件並添加註釋@Param所有函數的參數,這是不好的,我產生我的API。

糟糕的例子:

interface MyClient { 
    @RequestLine("GET {baseUrl}/internal-service") 
    String internalService(@Param("baseUrl") String host); 
} 

有沒有一種方法,使招搖發生器產生一個URI PARAM的API,而@Param註釋?

期望的結果實施例:

interface MyClient { 
    @RequestLine("POST /internal-service") 
    String internalService(URI baseUrl, @Param("someParam") String someParam); 
} 
+1

爲了得到這個,你將不得不修改模板和生成器,你可以在github上打開一個問題作爲feign生成器的增強或者建議,因爲這是該語言的一部分。首先,您必須能夠區分yaml中的URI參數,然後才能在生成器中對其進行解析,並在模板中正確顯示併爲此生成代碼。 – moondaisy

+0

非常感謝@moondaisy!對,我需要更改模板,但不一定是生成器。我可以使用配置讓swagger使用我的新模板。無論我會建議這個增強,如你所建議的那樣鼓吹:) – dorony

+1

雖然有效,但它會在所有接口的所有方法中放入URI參數,儘管你可能想要一些沒有它的方法,這就是爲什麼我建議修改發電機。很高興你找到了解決方案! – moondaisy

回答

4

初始溶液:

經過一番研究我認識到,有在swagger-codegen 2.2.3不支持用於生成URI參數作爲客戶端API函數的一部分。

但存在的 swagger-codegen-maven-plugin配置選項「templateDirectory - 目錄與鬍子模板」,給了一個路徑,包括鬍子模板文件夾,將模板文件夾中,並覆蓋具有相同名稱的現有。

例如:

 <plugin> 
      <groupId>io.swagger</groupId> 
      <artifactId>swagger-codegen-maven-plugin</artifactId> 
      <executions> 
       <execution> 
        <id>my-project-api-client-kit</id> 
        <goals> 
         <goal>generate</goal> 
        </goals> 
        <configuration> 
         <inputSpec>${project.build.directory}/my-project-api.yaml</inputSpec> 
         <language>java</language> 
         <configOptions> 
          <dateLibrary>java8</dateLibrary> 
          <sourceFolder>src/main/java</sourceFolder> 
         </configOptions> 
         <modelPackage>my.project.ck.resources.models</modelPackage> 
         <apiPackage>my.project.ck.resources.interfaces</apiPackage> 
         <library>feign</library> 
         <templateDirectory>/myTemplateFolder/</templateDirectory> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 

而且自定義模板文件夾裏面,把自己的api.mustache文件與額外的 「URI基本路徑」 參數:

... 
{{#returnType}}{{{returnType}}} {{/returnType}}{{^returnType}}void {{/returnType}}{{nickname}}(URI basePath, {{#allParams}}{{^isBodyParam}}{{^legacyDates}}@Param("{{paramName}}") {{/legacyDates}}{{#legacyDates}}@Param(value="{{paramName}}", expander=ParamExpander.class) {{/legacyDates}}{{/isBodyParam}}{{{dataType}}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}); 
... 

注: Swagger爲各種用途提供了很多模板,請確保根據您是我們的用戶來修改正確的api.mustache模板文件ING。 在上面的示例中,我修改(並覆蓋)java.libraries.feign/api.mustache文件,因爲這也是我的插件配置的文件(如示例中所示)。