1. 概要

REST APIを使用する場合、すべてのRESTエンドポイントを取得するのが一般的です。 たとえば、すべてのリクエストマッピングエンドポイントをデータベースに保存する必要がある場合があります。 このチュートリアルでは、Spring BootアプリケーションですべてのRESTエンドポイントを取得する方法を見ていきます。

2. エンドポイントのマッピング

Spring Bootアプリケーションでは、コントローラークラスの @RequestMapping アノテーションを使用して、RESTAPIエンドポイントを公開します。 これらのエンドポイントを取得するには、イベントリスナー、Spring Boot Actuator、またはSwaggerライブラリの3つのオプションがあります。

3. イベントリスナーアプローチ

REST APIサービスを作成するには、コントローラークラスで@RestController@RequestMappingを使用します。 これらのクラスは、SpringアプリケーションのコンテキストでSpringBeanとして登録されます。 したがって、アプリケーションコンテキストの起動準備が整ったときに、イベントリスナーを使用してエンドポイントを取得できます。 リスナーを定義する方法は2つあります。 ApplicationListener インターフェースを実装するか、@EventListenerアノテーションを使用できます。

3.1. ApplicationListenerインターフェース

ApplicationListener を実装するときは、 onApplicationEvent()メソッドを定義する必要があります。

@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
    ApplicationContext applicationContext = event.getApplicationContext();
    RequestMappingHandlerMapping requestMappingHandlerMapping = applicationContext
        .getBean("requestMappingHandlerMapping", RequestMappingHandlerMapping.class);
    Map<RequestMappingInfo, HandlerMethod> map = requestMappingHandlerMapping
        .getHandlerMethods();
    map.forEach((key, value) -> LOGGER.info("{} {}", key, value));
}

このように、ContextRefreshedEventクラスを使用します。 このイベントは、ApplicationContextが初期化または更新されたときに公開されます。 Spring Bootは、多くのHandlerMapping実装を提供します。 これらの中には、 RequestMappingHandlerMapping クラスがあります。このクラスは、リクエストマッピングを検出し、@RequestMappingアノテーションによって使用されます。 したがって、このBeanはContextRefreshedEventイベントで使用します。

3.2. @EventListenerアノテーション

エンドポイントをマップするもう1つの方法は、@EventListenerアノテーションを使用することです。 このアノテーションは、ContextRefreshedEventを処理するメソッドで直接使用します。

@EventListener
public void handleContextRefresh(ContextRefreshedEvent event) {
    ApplicationContext applicationContext = event.getApplicationContext();
    RequestMappingHandlerMapping requestMappingHandlerMapping = applicationContext
        .getBean("requestMappingHandlerMapping", RequestMappingHandlerMapping.class);
    Map<RequestMappingInfo, HandlerMethod> map = requestMappingHandlerMapping
        .getHandlerMethods();
    map.forEach((key, value) -> LOGGER.info("{} {}", key, value));
}

4. アクチュエータアプローチ

すべてのエンドポイントのリストを取得するための2番目のアプローチは、 Spring BootActuator機能を使用することです。

4.1. Mavenの依存関係

この機能を有効にするために、 spring -boot-actuatorMaven依存関係をpom.xmlファイルに追加します。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

4.2. 構成

spring-boot-actuator 依存関係を追加すると、デフォルトでは /healthおよび/infoエンドポイントのみが使用可能になります。 すべてのアクチュエータエンドポイントを有効にするには、application.propertiesファイルにプロパティを追加してそれらを公開します。

management.endpoints.web.exposure.include=*

または、マッピングを取得するためのエンドポイントを公開するだけです

management.endpoints.web.exposure.include=mappings

有効にすると、アプリケーションのRESTAPIエンドポイントがhttp:// host/アクチュエータ/mappingsで利用できるようになります。

5. Swagger

Swaggerライブラリを使用して、RESTAPIのすべてのエンドポイントを一覧表示することもできます。

5.1. Mavenの依存関係

プロジェクトに追加するには、pom.xmlファイルにspringfox-boot-starter依存関係が必要です。

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-boot-starter</artifactId>
    <version>3.0.0</version>
</dependency>

5.2. 構成

Docket beanを定義して、構成クラスを作成しましょう。

@Bean
public Docket api() {
    return new Docket(DocumentationType.SWAGGER_2)
      .select()
      .apis(RequestHandlerSelectors.any())
      .paths(PathSelectors.any())
      .build();
}

Docket は、Swaggerドキュメントの生成を構成するビルダークラスです。 REST APIエンドポイントにアクセスするには、ブラウザーで次のURLにアクセスします。

http://host/v2/api-docs

6. 結論

この記事では、イベントリスナー、Spring Boot Actuator、およびSwaggerライブラリを使用して、SpringBootアプリケーションでリクエストマッピングエンドポイントを取得する方法について説明します。

いつものように、このチュートリアルで使用されるすべてのコードサンプルはGitHubで入手できます。