如何使用OpenAPITools创建Spring-Boot REST服务器

时间:2020-10-11 12:32:21

标签: java spring-boot swagger-codegen openapi-generator openapitools

我使用swagger.io中的工具创建了一个Spring Boot服务器,现在将其移植到OpenAPITools。但是我找不到等效的生成器。我尝试将generaterName设置为spring,但是它创建了一个稍微不同的应用程序。首先,即使它不是MVC应用程序,它也使用WebMvcConfigurer Bean。其次,生成的Controller和AP​​I没有给我ObjectMapper。第三,它们给我提供了一个更加模糊的NativeWebRequest实例,而不是HttpServletRequest。 swagger.io上的spring REST生成器是否有匹配的生成器?我在做错什么吗?

这是我pom.xml文件中的openApiTools maven插件:

<plugin>
    <groupId>org.openapitools</groupId>
    <artifactId>openapi-generator-maven-plugin</artifactId>
    <!-- RELEASE_VERSION -->
    <version>4.3.1</version>
    <!-- /RELEASE_VERSION -->
    <executions>
        <execution>
            <goals>
                <goal>generate</goal>
            </goals>
            <configuration>
                <!-- Configuration properties taken from -->
                <!-- https://github.com/OpenAPITools/openapi-generator/blob/master/modules/openapi-generator-maven-plugin/README.md -->
                <inputSpec>${project.basedir}/src/gen/java/main/pizzeria.yaml</inputSpec>
                <generatorName>spring</generatorName>
                <!-- <output>${project.basedir}</output>-->
                <!-- Defaults to ${project.build.directory}/generated-sources/openapi -->
                <apiPackage>com.dummy.pizzeria.api</apiPackage>
                <modelPackage>com.dummy.pizzeria.model</modelPackage>
                <invokerPackage>com.dummy.pizzeria</invokerPackage>
                <packageName>com.dummy.pizzeria.objects</packageName>
                <groupId>neptunedreams</groupId>
                <artifactId>pizzeria</artifactId>
                <library>spring-boot</library>
                <generateModelTests>false</generateModelTests>
                <!--<generateSupportingFiles>false</generateSupportingFiles>-->
                <configOptions>
                    <!-- configOptions are specific to the spring generator. These are taken from -->
                    <!-- https://github.com/OpenAPITools/openapi-generator/blob/master/docs/generators/spring.md -->
                    <sourceFolder>gen</sourceFolder>
                    <bigDecimalAsString>true</bigDecimalAsString>
                    <dateLibrary>java8</dateLibrary> <!-- Default-->
                    <performBeanValidation>true</performBeanValidation>
                    <useBeanValidation>true</useBeanValidation>
                    <skipDefaultInterface>true</skipDefaultInterface>
                    <library>spring-boot</library>
                    <interfaceOnly>false</interfaceOnly>
                </configOptions>
            </configuration>
        </execution>
    </executions>
</plugin>

1 个答案:

答案 0 :(得分:0)

我知道您在发布此处的前一天,在我们的Slack频道上问了同样的问题,但是您从未回复我的回复,因此我在这里重复了它。

仅当您将库指定为spring-mvc时,Spring才应输出MVC文件。这些生成器的默认库为spring-boot。我建议您检查pom和任何外部配置(通过configFile或maven属性指定),以查看配置是否有冲突。

您可以在我们的仓库中与this sample的配置文件进行比较。

我们support个库:

  • spring-mvc
  • spring-boot
  • spring-cloud

我确实运行了您上面发布的示例,并查看了spring boot输出。但是,我看到您没有定义输出目录(在示例中已将其注释掉),因此它只会生成到target/generated-sources中。我假设您可能曾经尝试过spring-mvc,然后开始意外地生成target

如果要生成为项目结构,则总是需要指定output。例如,要写出到./my-springboot,您需要添加:

<output>${project.basedir}/my-springboot</output>

这将按预期输出springboot代码:

➜  examples git:(master) ✗ tree my-springboot
my-springboot
├── README.md
├── pom.xml
└── src
    └── main
        ├── java
        │   ├── com
        │   │   └── dummy
        │   │       └── pizzeria
        │   │           ├── OpenAPI2SpringBoot.java
        │   │           ├── RFC3339DateFormat.java
        │   │           ├── api
        │   │           │   ├── ApiUtil.java
        │   │           │   ├── PetApi.java
        │   │           │   ├── PetApiController.java
        │   │           │   ├── StoreApi.java
        │   │           │   ├── StoreApiController.java
        │   │           │   ├── UserApi.java
        │   │           │   └── UserApiController.java
        │   │           └── model
        │   │               ├── Category.java
        │   │               ├── ModelApiResponse.java
        │   │               ├── Order.java
        │   │               ├── Pet.java
        │   │               ├── Tag.java
        │   │               └── User.java
        │   └── org
        │       └── openapitools
        │           └── configuration
        │               ├── HomeController.java
        │               └── OpenAPIDocumentationConfig.java
        └── resources
            └── application.properties

12 directories, 20 files

如果您想生成一个子模块,并且除了排除supportingFiles之外,还需要一些复杂的逻辑,我提到这是因为您在示例中已对此进行了注释,您可以定义一个外部忽略文件。

假设您不想修改pom,属性,自述文件以及已创建(或计划)的任何实现文件…在您的项目根目录中创建一个名为my-springboot.ignore的文件:

# This file works like .gitignore, patterns here won't be written or overwritten.
# Test files are never overwritten.
**/pom.xml
**/application.properties
**/README.md
**/*Impl.java

我还建议更新到生成器的5.0.0-beta2版本。

完整代码

这是我用来在本地测试的完整插件节点,包括上面的所有建议。

<plugin>
    <groupId>org.openapitools</groupId>
    <artifactId>openapi-generator-maven-plugin</artifactId>
    <version>5.0.0-beta2</version>
    <executions>
    <execution>
        <goals>
            <goal>generate</goal>
        </goals>
        <configuration>
            <ignoreFileOverride>${project.basedir}/my-springboot.ignores</ignoreFileOverride>
            <inputSpec>${project.basedir}/openapi.yaml</inputSpec>
            <generatorName>spring</generatorName>
            <apiPackage>com.dummy.pizzeria.api</apiPackage>
            <modelPackage>com.dummy.pizzeria.model</modelPackage>
            <invokerPackage>com.dummy.pizzeria</invokerPackage>
            <packageName>com.dummy.pizzeria.objects</packageName>
            <groupId>neptunedreams</groupId>
            <artifactId>pizzeria</artifactId>
            <library>spring-boot</library>
            <generateModelTests>false</generateModelTests>
            <output>${project.basedir}/my-springboot</output>
            <configOptions>
                <bigDecimalAsString>true</bigDecimalAsString>
                <dateLibrary>java8</dateLibrary>
                <performBeanValidation>true</performBeanValidation>
                <useBeanValidation>true</useBeanValidation>
                <skipDefaultInterface>true</skipDefaultInterface>
                <library>spring-boot</library>
                <interfaceOnly>false</interfaceOnly>
            </configOptions>
        </configuration>
    </execution>
    </executions>
</plugin>