如何使用swagger-codegen为动态伪基路径生成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

我有一个非常简单的问题:)

根据外部文档,它们支持通过api函数传递URI参数来动态更改外部客户端对象的基本路径:

好例子:

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
参数放在所有接口的所有方法中,我想你可能想要一些没有它的,这就是我建议修改生成器的原因。很高兴你找到了解决办法!