2017-08-09 4 views
3

J'ai une question assez simple :)comment générer un paramètre URI pour simuler basePath dynamique en utilisant swagger codegen?

Selon feindre des documents, ils soutiennent à changer le basePath d'un objet client feindre dynamiquement par le passage de paramètre URI Trough la fonction api like so:

bon exemple:

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

La chose est que je utilise fanfaronnades, qui génère mon API à partir d'un fichier YAML et en ajoutant l'annotation @param à tous les paramètres de la fonction, ce qui est bon pour moi.

BAD Exemple:

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

Y at-il un moyen de faire générateur de fanfaronnades pour générer une API avec un URI param, sans l'annotation @param?

Résultat souhaité Exemple:

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

Pour obtenir ceci, vous devrez modifier à la fois le modèle et le générateur, vous pouvez ouvrir un problème sur github comme une amélioration ou une suggestion pour le générateur de simulation car cela fait partie du langage. Pour commencer, vous devrez être capable de différencier le paramètre qui est l'URI dans le yaml afin qu'il puisse ensuite être analysé différemment dans le générateur et afficher correctement dans le template et donc le code généré. – moondaisy

+0

Merci beaucoup @moondaisy! Bon, j'ai besoin de changer le template mais pas forcément le générateur. Je peux utiliser la configuration pour que Swagger utilise mon nouveau modèle. Peu importe, je vais suggérer cette amélioration à swagger comme vous l'avez suggéré :) – dorony

+1

Cela fonctionne mais il mettra le paramètre 'URI' dans toutes les méthodes de toutes vos interfaces, je pensais que vous pourriez en avoir sans cela, c'est pourquoi j'ai suggéré de modifier le générateur. Content que tu trouves une solution! – moondaisy

Répondre

4

solution initiale:

Après quelques recherches, je me suis rendu compte qu'il n'y a pas de support dans swagger-codegen 2.2.3 pour générer paramètre URI dans le cadre de la fonction API client.

Mais il y a une option dans la configuration swagger-codegen-maven-plugin de « templateDirectory - répertoire avec des modèles de moustache », pour donner un chemin d'accès à un dossier comprenant des modèles de moustache, qui prendra les modèles dans ce dossier et passer outre l'existant avec le même nom .

exemple:

 <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> 

Et dans le dossier de modèles personnalisés, mettez votre propre fichier api.mustache avec le paramètre "URI basePath" supplémentaire:

... 
{{#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}}); 
... 

Note: Swagger fournit beaucoup de modèles pour une variété d'utilisations, assurez-vous de prendre et de modifier le fichier de modèle api.mustache correct selon lequel vous êtes nous ing. dans l'exemple ci-dessus J'ai modifié (et redéfinir) le fichier java.libraries.feign/api.mustache car c'est le fichier mon plugin est configuré aussi (comme dans l'exemple).