【问题标题】:how to generate URI parameter for dynamic feign basePath using swagger codegen?如何使用 swagger codegen 为动态 feign basePath 生成 URI 参数?
【发布时间】:2024-05-03 19:25:07
【问题描述】:

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

根据feign文档,他们支持通过api函数like so传递URI参数来动态改变feign客户端对象的basePath:

好例子:

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

问题是我正在使用 swagger,它从 yaml 文件生成我的 API 并将 @Param 注释添加到所有函数参数,这对我不利。

不好的例子:

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

有没有办法让 swagger 生成器生成带有 URI 参数的 API,而无需 @Param 注释?

期望的结果示例:

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

【问题讨论】:

  • 要得到这个,你必须修改模板和生成器,你可以在 github 上打开一个问题作为对 feign 生成器的增强或建议,因为这是语言的一部分。首先,您必须能够区分 yaml 中的 URI 参数,以便它可以在生成器中进行不同的解析,并在模板中正确显示,从而生成代码。
  • 非常感谢@moondaisy!没错,我需要更改模板,但不一定要更改生成器。我可以使用配置让 swagger 使用我的新模板。无论如何,我会按照您的建议建议对 swagger 进行这种增强:)
  • 这行得通,但它会将URI 参数放在所有接口的所有方法中,我虽然你可能想要一些没有它,这就是我建议修改生成器的原因。很高兴您找到了解决方案!

标签: swagger swagger-2.0 swagger-codegen netflix-feign feign


【解决方案1】:

初步解决方案:

经过一番调查,我意识到swagger-codegen 2.2.3 不支持生成 URI 参数作为客户端 API 函数的一部分。

但是swagger-codegen-maven-plugin配置中有一个选项 “templateDirectory - 带有 mustache 模板的目录”,用于提供包含 mustache 模板的文件夹的路径,它将获取该文件夹中的模板并覆盖现有的同名模板。

示例:

        <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 basePath”参数放在一起:

...
{{#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 模板文件。 在上面的示例中,我修改(并覆盖)了 java.libraries.feign/api.mustache 文件,因为这也是我的插件配置的文件(如示例中所示)。

【讨论】:

    最近更新 更多