У меня есть 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, таковы:
- какой openapi я должен использовать - 2 или 3? 3 новее, так что я подумал, что это очевидно
- если это openapi 3, как мне использовать это с версией плагина swagger codegen › = 3 в моем pom? почему я не могу разрешить зависимость? причиняет ли мне боль мое непонимание зависимостей от зависимостей плагинов?
- когда я вставляю эту версию 3.0.0-rc1 swagger codegen, почему я получаю все эти ошибки okhttp? Есть ли где-нибудь руководство, показывающее полную настройку END-TO-END, необходимую для использования этого плагина?
- даже в моем старом коде @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, если вы хотите его увидеть.