Как использовать плагин Swagger maven codegen с openapi 3.0 (Java + Spring Boot 2.2.4)

У меня есть API, который я пытаюсь переписать, который использует старый swagger-maven-codegen 2.3.1 с устаревшей версией Spring 1.5.9. Я вижу, что когда я запускаю mvn package или mvn install , плагин генерирует интерфейсы, которые реализуют все контроллеры. Все это, конечно же, определено в файле swagger.yaml.

Я следовал инструкциям swagger codegen в соответствии с их репозиторием github (https://github.com/swagger-api/swagger-codegen/tree/master/modules/swagger-codegen-maven-plugin) и просто указывает добавить его в раздел build -> plugins файла пом.xml. Таким образом, это прекрасно работает с кодегеном версии 2.3.1, который они используют в своем примере, но НЕ работает с версией = 3.0.0. Теперь вы можете сказать мне, что просто используйте 2.3.1, а затем но я хочу использовать спецификацию openapi 3, которая, согласно моим исследованиям, должна иметь версию кодегена swagger ›= 3.0.0. Ссылка:

Как исправить java.lang.RuntimeException: отсутствует swagger input или config?

Теперь обычно вы просто обновляете версию плагина в pom, но по какой-то причине мой код никогда не компилируется и не запускается, когда я использую версию плагина ›= 3.0.0. Я получаю это сообщение об ошибке в IntelliJ:

The POM for io.swagger:swagger-codegen-maven-plugin:jar:3.0.0 is missing, no dependency information available

Таким образом, они заставили меня поверить, что моя группа, артефакт или репозиторий были неправильными, поэтому я начал пытаться найти по URL-адресу mavencentral точный путь к этому JAR, и я заметил, что не видел никакой версии для 3.X.X, кроме эти два варианта 3.0.0-rc0 и 3.0.0-rc1, которые вы можете увидеть здесь: https://repo1.maven.org/maven2/io/swagger/swagger-codegen-maven-плагин/

О чудо, когда я попробовал 3.0.0-rc1 в своей версии pom, мой код начал компилироваться. У меня есть образец файла swagger api.yaml, который я читаю (очень простой только для тестирования), а затем я начал видеть, что теперь okhttp отсутствуют пакеты или что я пропустил это в своем pom. Тем не менее, я вижу, что он пытается сгенерировать заглушку сервера в прямом выводе /target, который я определил в моей конфигурации pom.xml для плагина, так что это хорошо: введите здесь описание изображения

Итак, я думаю, что мои вопросы на данный момент, чтобы подвести итог, также известные как TL; DR, таковы:

  1. какой openapi я должен использовать - 2 или 3? 3 новее, так что я подумал, что это очевидно
  2. если это openapi 3, как мне использовать это с версией плагина swagger codegen › = 3 в моем pom? почему я не могу разрешить зависимость? причиняет ли мне боль мое непонимание зависимостей от зависимостей плагинов?
  3. когда я вставляю эту версию 3.0.0-rc1 swagger codegen, почему я получаю все эти ошибки okhttp? Есть ли где-нибудь руководство, показывающее полную настройку END-TO-END, необходимую для использования этого плагина?
  4. даже в моем старом коде @Controllers реализуют интерфейсы, которые генерируются в каталоге /target. Я не вижу имен их интерфейсов, определенных в swagger.yaml, поэтому мне интересно, что это за шаблон проектирования ИЛИ где в документации swagger находятся эти инструкции?

В любом случае, так что да, если бы кто-нибудь мог помочь мне или объяснить некоторые из этих вещей или указать мне на статью, которая на самом деле показывает, как получить API с использованием swagger codegen от начала до конца, я был бы очень признателен!

Мой пом.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.mydomain.me</groupId>
    <artifactId>my-api</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>My API</name>
    <description>Version 2.0 of my API</description>
    <properties>
        <java.version>11</java.version>
    </properties>

    <pluginRepositories>
        <pluginRepository>
            <id>central</id>
            <name>Maven Central</name>
            <layout>default</layout>
            <url>https://repo1.maven.org/maven2</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </pluginRepository>
    </pluginRepositories>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>io.swagger.codegen.v3</groupId>
            <artifactId>swagger-codegen-cli</artifactId>
            <version>3.0.25</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>io.swagger</groupId>
                <artifactId>swagger-codegen-maven-plugin</artifactId>
                <version>3.0.0-rc1</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                        <configuration>
                            <inputSpec>${project.basedir}/src/main/resources/api.yaml</inputSpec>
                            <output>${project.basedir}/target/generated-sources</output>
                            <language>java</language>
                            <configOptions>
                                <sourceFolder>src/gen/java/main</sourceFolder>
                            </configOptions>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

Я также могу поделиться своим swagger.yaml, если вы хотите его увидеть.


person ennth    schedule 31.03.2021    source источник