如何使用swagger-codegen为动态伪基路径生成URI参数?
我有一个非常简单的问题:) 根据外部文档,它们支持通过api函数传递URI参数来动态更改外部客户端对象的基本路径: 好例子:如何使用swagger-codegen为动态伪基路径生成URI参数?,swagger,swagger-2.0,swagger-codegen,netflix-feign,feign,Swagger,Swagger 2.0,Swagger Codegen,Netflix Feign,Feign,我有一个非常简单的问题:) 根据外部文档,它们支持通过api函数传递URI参数来动态更改外部客户端对象的基本路径: 好例子: interface MyClient { @RequestLine("GET /internal-service") String internalService(URI baseUrl); } interface MyClient { @RequestLine("GET {baseUrl}/internal-service") Stri
interface MyClient {
@RequestLine("GET /internal-service")
String internalService(URI baseUrl);
}
interface MyClient {
@RequestLine("GET {baseUrl}/internal-service")
String internalService(@Param("baseUrl") String host);
}
interface MyClient {
@RequestLine("POST /internal-service")
String internalService(URI baseUrl, @Param("someParam") String someParam);
}
<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>
问题是我使用的是swagger,他从yaml文件生成API,并向所有函数参数添加@Param注释,这对我不好
坏例子:
interface MyClient {
@RequestLine("GET /internal-service")
String internalService(URI baseUrl);
}
interface MyClient {
@RequestLine("GET {baseUrl}/internal-service")
String internalService(@Param("baseUrl") String host);
}
interface MyClient {
@RequestLine("POST /internal-service")
String internalService(URI baseUrl, @Param("someParam") String someParam);
}
<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>
有没有办法让swagger generator生成一个带有URI参数的API,而不使用@param注释
期望的结果示例:
interface MyClient {
@RequestLine("GET /internal-service")
String internalService(URI baseUrl);
}
interface MyClient {
@RequestLine("GET {baseUrl}/internal-service")
String internalService(@Param("baseUrl") String host);
}
interface MyClient {
@RequestLine("POST /internal-service")
String internalService(URI baseUrl, @Param("someParam") String someParam);
}
<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>
初始解决方案:
经过一些调查之后,我意识到中不支持将URI参数作为客户端API函数的一部分生成
但在配置中有一个选项
“templateDirectory-带mustache templates的目录”,用于提供包含mustache templates的文件夹的路径,该文件夹将获取该文件夹中的模板,并覆盖具有相同名称的现有文件夹
示例:
interface MyClient {
@RequestLine("GET /internal-service")
String internalService(URI baseUrl);
}
interface MyClient {
@RequestLine("GET {baseUrl}/internal-service")
String internalService(@Param("baseUrl") String host);
}
interface MyClient {
@RequestLine("POST /internal-service")
String internalService(URI baseUrl, @Param("someParam") String someParam);
}
<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>
注意:
Swagger为各种用途提供了大量模板,请确保使用并修改正确的api.mustache模板文件。
在上面的示例中,我修改(并覆盖)了java.libraries.feign/api.mustache文件,因为这也是我的插件配置的文件(如示例中所示)。要获得此结果,您必须修改模板和生成器,您可以在github上打开一个问题,作为对Faign generator的增强或建议,因为这是该语言的一部分。首先,您必须能够区分yaml中的URI参数,以便在生成器中对其进行不同的解析,并在模板中正确显示,从而生成代码。非常感谢@moondaisy!是的,我需要更改模板,但不一定要更改生成器。我可以使用配置使swagger使用我的新模板。尽管如此,我还是会像你建议的那样向swagger推荐这个增强:)这是可行的,但它会将
URI
参数放在所有接口的所有方法中,我想你可能想要一些没有它的,这就是我建议修改生成器的原因。很高兴你找到了解决办法!