Swagger для Micronaut с maven

Я хочу перейти на платформу Micronaut из Spring Boot 2. И я борюсь с настройками Swagger.

В проекте Spring Boot 2 у меня есть следующие зависимости:

    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>2.6.1</version>
    </dependency>
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger-ui</artifactId>
        <version>2.6.1</version>
    </dependency>

и SwaggerConfig.class:

@Configuration
@EnableSwagger2
public class SwaggerConfig {
    @Bean
    public Docket swagger() {
        return new Docket(DocumentationType.SWAGGER_2)
            .apiInfo(getApiInfo())
            .select()
            .apis(RequestHandlerSelectors.withClassAnnotation(RestController.class))
            .paths(PathSelectors.any())
            .build();
    }

    private ApiInfo getApiInfo() {
        return new ApiInfo("test",
            "",
            "",
            "",
            new Contact("", "https://test.test", ""),
            "",
            "");
    }
}

И он отлично работает, запуская swagger-ui вместе с приложением Spring Boot 2.

Какие зависимости я должен добавить в maven и какие классы создать, чтобы получить тот же результат для проекта Micronaut?

Не удалось выполнить цель org.apache.maven.plugins
Не удалось выполнить цель org.apache.maven.plugins
Опишу, что когда я только начинал изучать Maven, у меня не получалось компилировать и упаковывать.
Blibli Automation Journey - Как захватить сетевой трафик с помощью утилиты HAR в Selenium 4
Blibli Automation Journey - Как захватить сетевой трафик с помощью утилиты HAR в Selenium 4
Если вы являетесь веб-разработчиком или тестировщиком, вы можете быть знакомы с Selenium, популярным инструментом для автоматизации работы...
8
0
4 998
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Предполагая, что приложение уже создано, добавьте к вам pom.xml:

<dependency>
  <groupId>io.swagger.core.v3</groupId>
  <artifactId>swagger-annotations</artifactId>
  <version>${swagger.version}</version>
  <scope>compile</scope>
</dependency>

где свойство swagger.version установлено на 2.0.3

добавьте следующее к вам annotationProcessorPaths в maven-compiler-plugin

<path>
  <groupId>io.micronaut.configuration</groupId>
  <artifactId>micronaut-openapi</artifactId>
  <version>${micronaut.version}</version>
</path>

Затем добавьте следующее в раздел вашего маршрутизатора micronaut.

micronaut:
    router:
        static-resources:
            swagger:
                paths: classpath:META-INF/swagger
                mapping: ${application.api.swagger.path}/**

Это откроет ваш yml-файл swagger / oas, созданный во время компиляции, при условии, что вы используете конфигурацию ниже. Вы, конечно, можете заменить ${application.api.swagger.path} на /api-docs/swagger или что-то еще по своему вкусу. Как описано в документации, вы также можете выполнить следующий --features=swagger-java, чтобы добавить указанные выше зависимости при первоначальном создании проекта.

Если вы хотите отобразить спецификацию api из самого приложения, вам нужно добавить еще код. Следующий пример, вероятно, более конкретизирован, чем нужно, но для моей цели приложение служит центральным средством визуализации для спецификаций swagger / oas.

Сначала добавьте контроллер, который вам нужен, и аннотируйте контроллер с помощью @Hidden, чтобы убедиться, что он не обрабатывается процессором аннотаций.

@Hidden
@Controller("/api")
public class SwaggerController {

    @Inject
    SwaggerConfig config;

    @View("swagger/index")
    @Get
    public SwaggerConfig index() {
        return config;
    }
}

Затем добавьте следующий класс конфигурации, который связывает свойства снизу

@ConfigurationProperties(SwaggerConfig.PREFIX)
public class SwaggerConfig {

    public static final String PREFIX = "application.api.swagger";

    private String version;
    private String layout;
    private boolean deepLinking;
    private List<URIConfig> urls;

    public String getVersion() {
        return version;
    }

    public void setVersion(String version) {
        this.version = version;
    }

    public String getLayout() {
        return layout;
    }

    public void setLayout(String layout) {
        this.layout = layout;
    }

    public boolean isDeepLinking() {
        return deepLinking;
    }

    public void setDeepLinking(boolean deepLinking) {
        this.deepLinking = deepLinking;
    }

    public List<URIConfig> getUrls() {
        return urls;
    }

    public void setUrls(List<URIConfig> urls) {
        this.urls = urls;
    }


    @ConfigurationProperties(URIConfig.PREFIX)
    public static class URIConfig {

        static final String PREFIX = "urls";

        private String name;
        private String url;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getUrl() {
            return url;
        }

        public void setUrl(String url) {
            this.url = url;
        }
    }

}

Приведенный выше класс конфигурации связывает следующую конфигурацию из application.yml, но должен быть размещен перед конкретной конфигурацией micronaut.

application:
    api:
        swagger:
            path: /api-docs/swagger
            version: 3.19.4
            layout: StandaloneLayout
            deepLinking: true
            urls:
            - name: ubw-rest
              url: /api-docs/swagger/ubw-rest-0.1.yml

Когда это будет сделано, добавьте следующую зависимость руля / усов к pom

<dependency>
  <groupId>com.github.jknack</groupId>
  <artifactId>handlebars</artifactId>
  <version>4.1.0</version>
  <scope>runtime</scope>
</dependency>

В папке ресурсов создайте папку с именем swagger, а затем создайте файл index.hbs, содержащий следующее.

<!DOCTYPE html>
<html lang = "en">
<head>
    <meta charset = "UTF-8">
    <title>Swagger-ui</title>

    <link rel = "icon" type = "image/png" href = "https://unpkg.com/swagger-ui-dist@{{version}}/favicon-32x32.png">
    <link rel = "stylesheet" type = "text/css" href = "https://unpkg.com/swagger-ui-dist@{{version}}/swagger-ui.css">

    <script src = "https://unpkg.com/swagger-ui-dist@{{version}}/swagger-ui-standalone-preset.js"></script>
    <script src = "https://unpkg.com/swagger-ui-dist@{{version}}/swagger-ui-bundle.js"></script>
</head>
<body>
    <div id = "swagger-ui"></div>
    <script>
        window.onload = function() {
            var ui = SwaggerUIBundle({
                urls: [{{#each urls}}
                    {
                        name: "{{name}}",
                        url: "{{url}}"
                    }{{#unless @last}},{{/unless}}{{/each}}
                ],
                dom_id: '#swagger-ui',
                deepLinking: {{deepLinking}},
                presets: [
                    SwaggerUIBundle.presets.apis,
                    SwaggerUIStandalonePreset
                ],
                plugins: [
                    SwaggerUIBundle.plugins.DownloadUrl
                ],
                layout: "{{layout}}"
            });
            window.ui = ui
        }
    </script>
</body>
</html>

Наконец, в главном классе приложения добавьте аннотацию @OpenApiDefinition, чтобы позволить процессору аннотаций сканировать все приложение.

@OpenAPIDefinition(
        info = @Info(
                title = "swagger-server",
                version = "0.1",
                description = "My API",
                license = @License(name = "Apache 2.0")
        )
)
public class Application {

    public static void main(String[] args) {
        Micronaut.run(Application.class);
    }
}

Небольшой совет относительно процессора аннотаций в том виде, в котором он представлен в micronaut 1.0.0, заключается в том, что общедоступные поля объекта не будут отображаться, поэтому вам понадобятся геттеры / сеттеры, если вы хотите увидеть схему для входных или возвращаемых значений.

Если вы хотите опробовать работающий пример из вышеперечисленного, у меня есть репозиторий с конфигурацией сервера swagger, расположенный здесь https://github.com/frehov/micronaut-swagger-server, который включает возможность создавать сообщение со списком пар URL-адресов и имен, которые будут отображаться с помощью Swagger.

Привет, @Fredrik Hov, не могли бы вы взглянуть на мой пост, я основал свою конфигурацию swagger в вашем проекте, однако я не могу отобразить API из определенного модуля. Я создал репо, чтобы показать проект stackoverflow.com/questions/66438057/… Репо: github.com/amhg/swagger

marhg 02.03.2021 14:16

Micronaut может автоматически генерировать определения Swagger YAML из нашего контроллера и методов на основе этих аннотаций. Добавьте зависимость swagger-annotations pom.xml.

<dependency>
    <groupId>io.swagger.core.v3</groupId>
    <artifactId>swagger-annotations</artifactId>
    <version>2.0.5</version>
</dependency>

Добавьте аннотацию @OpenAPIDefinition к основному классу приложения.

@OpenAPIDefinition(
    info = @Info(
        title = "my app",
        version = "1.0",
        description = "my api",
        contact = @Contact(url = "http://something.com", name = "something", email = "something")
    )
)
public class Application {
    public static void main(String[] args) {
        Micronaut.run(Application.class);
 }
}

Micronaut создает файл Swagger по адресу target / classes / META-INF / swagger / my-app-1.0.yml. Мы можем предоставить его вне приложения, используя конечную точку HTTP. Вот соответствующая конфигурация, предоставленная в файле application.yml.

micronaut:
  router:
    static-resources:
      swagger:
        paths: classpath:META-INF/swagger
        mapping: /swagger/**

Путь доступа http: // локальный: 8080 / swagger / мое-приложение-1.0.yml.

In comparison to Spring Boot, we don't have projects like Swagger SpringFox for Micronaut, so we need to copy the content to an online editor in order to see the graphical representation of our Swagger YAML.

Вставьте содержимое my-app-1.0.yml в https://editor.swagger.io/ и добавьте сервер для доступа к пользовательскому интерфейсу Swagger.

Читать документ Микронавта - https://micronaut-projects.github.io/micronaut-openapi/latest/guide/index.html

Другие вопросы по теме