【问题标题】:OpenApi 3.0 SpringBoot Controller useOpenApi 3.0 SpringBoot 控制器使用
【发布时间】:2020-01-26 13:50:23
【问题描述】:

使用 openapi maven 插件:

<dependency>
    <groupId>org.openapitools</groupId>
    <artifactId>openapi-generator-maven-plugin</artifactId>
    <version>4.2.2</version>
</dependency>

并使用以下 pom 配置生成 Spring Boot 控制器:

     <plugin>
        <groupId>org.openapitools</groupId>
        <artifactId>openapi-generator-maven-plugin</artifactId>
        <version>4.2.2</version>
        <executions>
          <execution>
            <id>spring-server</id>
            <goals>
              <goal>generate</goal>
            </goals>
            <configuration>
              <!-- specify the swagger yaml -->
              <inputSpec>${project.resources[0].directory}/pet-store.yaml</inputSpec>
              <!-- target to generate java client code -->
              <generatorName>spring</generatorName>
              <!-- pass any necessary config options -->
              <configOptions>
                <serializableModel>true</serializableModel>
                <snapshotVersion>true</snapshotVersion>
              </configOptions>

            </configuration>
          </execution>

        </executions>
      </plugin>

会生成这样的控制器:

@Controller
@RequestMapping("${openapi.openAPIPetstore.base-path:/v2}")
public class StoreApiController implements StoreApi {

    private final NativeWebRequest request;

    @org.springframework.beans.factory.annotation.Autowired
    public StoreApiController(NativeWebRequest request) {
        this.request = request;
    }

    @Override
    public Optional<NativeWebRequest> getRequest() {
        return Optional.ofNullable(request);
    }

}

这很好,但我如何绑定到它以添加业务逻辑而不更改实际生成的代码?如果我扩展控制器以添加业务逻辑,我会遇到各种问题。

你应该如何使用这个生成的代码,扩展它以添加正确的业务逻辑而不改变生成的代码,这会很糟糕。

【问题讨论】:

    标签: java spring-boot openapi openapi-generator


    【解决方案1】:

    我在尝试处理 OAS 3.0 时遇到了您的问题,因此使用了提到的 openapi-generator-maven-plugin。同时,我让它准确地生成了您所描述的内容。

    我建议通过

    处理这个问题
    1. 将您的模型和 API 类与您的代码生成一个单独的包
    2. 将 Spring 的 @ComponentScan 注释配置为不包含生成的类(单独使用 basePackages 属性或将其与显式 excludeFilters 属性结合使用)。

    是的,修改生成的类是不好的。我只是将它们用作创建实际控制器的起点。

    修正:在以各种方式配置代码生成之后,我发现了仅创建 API(接口)的最佳解决方案。这样我就可以实现我的控制器,而无需其他实现干扰它。

    为了实现这一点,我的插件配置现在看起来像这样(使用 configOptions/interfaceOnly 选项):

                <plugin>
                    <!-- generate REST API from spec -->
                    <groupId>org.openapitools</groupId>
                    <artifactId>openapi-generator-maven-plugin</artifactId>
                    <version>4.2.2</version>
                    <executions>
                        <execution>
                            <goals>
                                <goal>generate</goal>
                            </goals>
                            <configuration>
                                <inputSpec>${project.basedir}/src/main/resources/api.yaml</inputSpec>
                                <generatorName>spring</generatorName>
                                <generateModels>true</generateModels>
                                <generateApis>true</generateApis>
                                <generateApiDocumentation>true</generateApiDocumentation>
                                <generateSupportingFiles>true</generateSupportingFiles>
                                <modelPackage>example.openapi.model</modelPackage>
                                <apiPackage>example.openapi.api</apiPackage>
                                <package>example.openapi</package>
                                <output>${generated.sources.restapi.dir}</output>
                                <configOptions>
                                    <interfaceOnly>true</interfaceOnly>
                                    <dateLibrary>java8-localdatetime</dateLibrary>
                                    <java8>true</java8>
                                    <useBeanValidation>true</useBeanValidation>
                                </configOptions>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
    

    【讨论】:

    • 谢谢!我缺少的配置是 true。这就是我想要的。
    • 嗨@tim82,我遇到了问题,我的springboot没有加载生成的类,你遇到过这种问题吗?
    • @tim82 您是如何导入生成的界面以在主应用程序 Swagger UI v3 中可见的?在我的应用中我看不到v2/api-docs,只能看到/v3/api-docs
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-19
    • 2021-07-20
    • 1970-01-01
    相关资源
    最近更新 更多