web-dev-qa-db-ja.com

既存のSpring BootアプリからOpenApi 3.0仕様を生成する方法は?

私は(できればYAMLで)Open API 3.0仕様を作成したいプロジェクト(Spring Boot App + Kotlin)を持っています。 Springfoxライブラリは素晴らしいですが、Swagger 2.0 JSONを生成します。コントローラーのアノテーションからOpen Api 3.0仕様を生成する最良の方法は何ですか?最初から書くのが唯一の方法ですか?

15
ladyskynet

私たちはkotlinプロジェクトでspringdoc-openapiライブラリを使用しており、Spring Bootプロジェクトを使用してAPIドキュメントの生成を自動化するというニーズを満たしています。

Swagger-uiをスプリングブートアプリケーションに自動的にデプロイします

Swagger UIページは次の場所で利用可能になります。- http:// server:port/context-path/swagger-ui.html OpenAPIの説明はjson形式の次のURLで入手可能:- http:// server:port/context-path/v3/api-docs

ライブラリをプロジェクトの依存関係のリストに追加します(追加の構成は必要ありません)

 <dependency>
      <groupId>org.springdoc</groupId>
      <artifactId>springdoc-openapi-ui</artifactId>
      <version>1.2.32</version>
  </dependency>
8
ouled saber

spring-restdocs および restdocs-api-spec を確認できます。

spring-restdocsは、Spring-foxが使用するイントロスペクション主導のアプローチよりも多くの利点を持つ、AP​​Iドキュメンテーションへのテスト主導のアプローチを採用しています。 restdocs-api-specは、API仕様のサポートを追加するspring-restdocsの拡張機能です。現在、OpenAPI2 OpenAPI3およびPostmanをサポートしています。

4
Mathias Dpunkt

私は自分のジェネレーターを実装することにしました https://github.com/jrcodeza/spring-openapi 多分あなたもそれをチェックすることができます。これはリフレクションに基づいており、javaxおよびスプリングアノテーションをサポートしています。また、Jacksonアノテーションに基づく継承モデル(判別子付き)を生成します。さらに、生成プロセスを変更したい場合(たとえば、独自のアノテーションがあり、スキーマの生成されたセクションを調整する必要がある場合)は、独自のインターセプターを定義できます。ランタイムモードで、またはMavenプラグインとして使用できます。 JavaクライアントジェネレーターへのOpenAPI3もあります。これは、openapi3仕様からモデルを生成します。ここでも、正しい継承のためにJavaxアノテーションとJacksonアノテーションも生成します。

3
Jakub Remenec

Jax-rsを使用している場合、このチュートリアルが役立ちます。 Apache CXF実装を使用します。 Spring Bootを使用し、Open API 3.0仕様を生成するjaxrsの他の実装を見つけることができませんでした。

次の依存関係が必要です。

<dependency>
    <groupId>org.Apache.cxf</groupId>
    <artifactId>cxf-rt-rs-service-description-openapi-v3</artifactId>
    <version>3.2.4</version>
</dependency>

<dependency>
    <groupId>org.webjars</groupId>
    <artifactId>swagger-ui</artifactId>
    <version>3.13.6</version>
</dependency>

一般的な構成は次のとおりです。詳細はリンクにあります。

@Configuration
@EnableAutoConfiguration
@ComponentScan(basePackageClasses = PeopleRestService.class)
public class AppConfig {
    @Autowired private PeopleRestService peopleRestService;
    @Bean(destroyMethod = "destroy")
    public Server jaxRsServer(Bus bus) {
        final JAXRSServerFactoryBean factory = new JAXRSServerFactoryBean();
        factory.setApplication(new JaxRsApiApplication());
        factory.setServiceBean(peopleRestService);
        factory.setProvider(new JacksonJsonProvider());
        factory.setFeatures(Arrays.asList(new OpenApiFeature()));
        factory.setBus(bus);
        factory.setAddress("/");
        return factory.create();
    }
    @Bean
    public ServletRegistrationBean cxfServlet() {
        final ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new CXFServlet(), "/api/*");
        servletRegistrationBean.setLoadOnStartup(1);
        return servletRegistrationBean;
    }
}

https://dzone.com/articles/moving-with-the-times-towards-openapi-v300-adoptio

1
Jerry Li