Spring Boot構成メタデータのガイド

1. 概要

Spring Bootアプリケーションを作成する場合、https://www.baeldung.com/configuration-properties-in-spring-boot [構成プロパティをJava Beanにマップ]を使用すると便利です。 しかし、これらのプロパティを文書化する最良の方法は何ですか?
このチュートリアルでは、https://docs.spring.io/spring-boot/docs/current/reference/html/configuration-metadata.html#configuration-metadata-annotation-processor [Spring Boot Configuration Processor]を調べます。 ]およびhttps://docs.spring.io/spring-boot/docs/current/reference/html/configuration-metadata.html#configuration-metadata-format [関連するJSONメタデータファイル]は、各プロパティの意味、制約、等々。

2. 構成メタデータ

開発者として作業するほとんどのアプリケーションは、ある程度構成可能でなければなりません。 ただし、通常、構成パラメーターが何を行うのか、デフォルト値が設定されている場合、廃止されている場合、実際にはプロパティが存在することすらわかりません。
役立つように、Spring BootはJSONファイルで構成メタデータを生成し、プロパティの使用方法に関する有用な情報を提供します。 したがって、*構成メタデータは、構成プロパティとの対話に必要な情報を含む記述ファイルです*
このファイルの素晴らしい点は、* IDEもそれを読むことができる*ことです。これにより、Springプロパティのオートコンプリートやその他の構成ヒントが得られます。

3. 依存関係

この構成メタデータを生成するには、https://search.maven.org/search?q = spring-boot-configuration-processor [_spring-boot-configuration-processor_dependency]の構成プロセッサを使用します。
それでは、依存関係を_optional_として追加してみましょう。
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <version>2.1.7.RELEASE</version>
    <optional>true</optional>
</dependency>
この依存関係は、プロジェクトをビルドするときに呼び出されるJava注釈プロセッサを提供します。 これについては後で詳しく説明します。
プロジェクトが使用する他のモジュールに_ @ ConfigurationProperties_が適用されないようにするために、Mavenで_optional_として依存関係を追加することをお勧めします。

4. 構成プロパティの例

プロセッサの動作を確認するには、Java Beanを介してSpring Bootアプリケーションに含める必要があるいくつかのプロパティがあることを想像してみましょう。
@Configuration
@ConfigurationProperties(prefix = "database")
public class DatabaseProperties {

    public static class Server {

        private String ip;
        private int port;

        // standard getters and setters
    }

    private String username;
    private String password;
    private Server server;

    // standard getters and setters
}
これを行うには、https://www.baeldung.com/configuration-properties-in-spring-boot [_ @ ConfigurationProperties_]アノテーションを使用します。 *構成プロセッサは、このアノテーションを使用してクラスとメソッドをスキャンし、構成パラメータにアクセスして構成メタデータを生成します。
これらのプロパティをいくつかプロパティファイルに追加しましょう。 この場合、_databaseproperties-test.properties_と呼びます。
#Simple Properties
database.username=baeldung
database.password=password
そして、念のため、テストを追加して、全員が揃っていることを確認します。
@RunWith(SpringRunner.class)
@SpringBootTest(classes = AnnotationProcessorApplication.class)
@TestPropertySource("classpath:databaseproperties-test.properties")
public class DatabasePropertiesIntegrationTest {

    @Autowired
    private DatabaseProperties databaseProperties;

    @Test
    public void whenSimplePropertyQueriedThenReturnsPropertyValue()
      throws Exception {
        Assert.assertEquals("Incorrectly bound Username property",
          "baeldung", databaseProperties.getUsername());
        Assert.assertEquals("Incorrectly bound Password property",
          "password", databaseProperties.getPassword());
    }

}
また、内部クラス_Server_を介して、ネストされたプロパティ_database.server.id_および_database.server.port_を追加しました。 *内部クラス* _ * Server * _ *およびフィールド* _ * server * _ *独自のゲッターとセッターを追加する必要があります*
このテストでは、ネストされたプロパティを正常に設定および読み取ることができることを確認するために、簡単なチェックを行います。
@Test
public void whenNestedPropertyQueriedThenReturnsPropertyValue()
  throws Exception {
    Assert.assertEquals("Incorrectly bound Server IP nested property",
      "127.0.0.1", databaseProperties.getServer().getIp());
    Assert.assertEquals("Incorrectly bound Server Port nested property",
      3306, databaseProperties.getServer().getPort());
}
さて、これでプロセッサを使用する準備が整いました。

5. 構成メタデータの生成

前に、構成プロセッサがファイルを生成することを述べました。これは注釈処理を使用します。
したがって、プロジェクトをコンパイルすると、* _ * spring-configuration-metadata.json * _ * inside * __ * target / classes / META-INF * __ **:**というファイルが表示されます。
{
  "groups": [
    {
      "name": "database",
      "type": "com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties",
      "sourceType": "com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties"
    },
    {
      "name": "database.server",
      "type": "com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties$Server",
      "sourceType": "com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties",
      "sourceMethod": "getServer()"
    }
  ],
  "properties": [
    {
      "name": "database.password",
      "type": "java.lang.String",
      "sourceType": "com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties"
    },
    {
      "name": "database.server.ip",
      "type": "java.lang.String",
      "sourceType": "com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties$Server"
    },
    {
      "name": "database.server.port",
      "type": "java.lang.Integer",
      "sourceType": "com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties$Server",
      "defaultValue": 0
    },
    {
      "name": "database.username",
      "type": "java.lang.String",
      "sourceType": "com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties"
    }
  ],
  "hints": []
}
次に、Java Beanの注釈の変更がメタデータにどのように影響するかを見てみましょう。

5.1. 構成メタデータに関する追加情報

まず、_Server_にJavaDocコメントを追加しましょう。
次に、_database.server.port_フィールドにデフォルト値を設定し、最後に_ @ Min_および_ @ Max_アノテーションを追加します。
public static class Server {

    /**
     * The IP of the database server
     */
    private String ip;

    /**
     * The Port of the database server.
     * The Default value is 443.
     * The allowed values are in the range 400-4000.
     */
    @Min(400)
    @Max(800)
    private int port = 443;

    // standard getters and setters
}
ここで_spring-configuration-metadata.json_ファイルを確認すると、次の追加情報が反映されていることがわかります。
{
  "groups": [
    {
      "name": "database",
      "type": "com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties",
      "sourceType": "com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties"
    },
    {
      "name": "database.server",
      "type": "com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties$Server",
      "sourceType": "com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties",
      "sourceMethod": "getServer()"
    }
  ],
  "properties": [
    {
      "name": "database.password",
      "type": "java.lang.String",
      "sourceType": "com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties"
    },
    {
      "name": "database.server.ip",
      "type": "java.lang.String",
      "description": "The IP of the database server",
      "sourceType": "com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties$Server"
    },
    {
      "name": "database.server.port",
      "type": "java.lang.Integer",
      "description": "The Port of the database server. The Default value is 443.
        The allowed values are in the range 400-4000",
      "sourceType": "com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties$Server",
      "defaultValue": 443
    },
    {
      "name": "database.username",
      "type": "java.lang.String",
      "sourceType": "com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties"
    }
  ],
  "hints": []
}
_database.server.ip_および__database.server.port __fieldsとの違いを確認できます。 実際、追加情報は非常に役立ちます。 その結果、開発者とIDEが各プロパティの機能を理解しやすくなります。
また、更新されたファイルを取得するためにビルドをトリガーすることを確認する必要があります。 Eclipseでは、[自動的にビルド]オプションをチェックすると、各保存アクションがビルドをトリガーします。 IntelliJでは、手動でビルドをトリガーする必要があります。

* 5.2。 メタデータ形式について*

JSONメタデータファイルを詳しく見て、そのコンポーネントについて説明しましょう。
_Groups_は、値自体を指定せずに他のプロパティをグループ化するために使用される上位レベルのアイテムです。 この例では、_database_グループがあり、これは構成プロパティのプレフィックスでもあります。 _server_グループもあります。これは、内部クラスとグループ_ip_および_port_プロパティを介して作成しました。
_Properties_は、値を指定できる構成アイテムです。 これらのプロパティは_.properties_または_.yml_ファイルで設定され、上記の例で見たように、デフォルト値や検証などの追加情報を持つことができます。
_ヒント_は、ユーザーがプロパティ値を設定するのに役立つ追加情報です。 たとえば、プロパティに許可された値のセットがある場合、それぞれの機能の説明を提供できます。 IDEは、これらのヒントの自動競合ヘルプを提供します。
構成メタデータの各コンポーネントには独自のhttps://docs.spring.io/spring-boot/docs/current/reference/html/configuration-metadata.html[attributes]があり、構成プロパティの詳細を説明しています。

6. 結論

この記事では、Spring Boot Configuration Processorと、その構成メタデータを作成する機能について説明しました。 このメタデータを使用すると、構成パラメーターとの対話がはるかに簡単になります。
生成された構成メタデータの例を挙げ、その形式とコンポーネントについて詳しく説明しました。
また、IDEでのオートコンプリートサポートがどれほど役立つかを見ました。
いつものように、この記事で言及されているすべてのコードスニペットは、https://github.com/eugenp/tutorials/tree/master/spring-boot-autoconfiguration [our GitHub repository]で見つけることができます。