1. 概要

この短いチュートリアルでは、YAMLリストをSpring Bootのリストにマップする方法を詳しく見ていきます。

YAMLでリストを定義する方法の背景から始めましょう。

次に、YAMLリストをオブジェクトのListにバインドする方法を詳しく調べます。

2. YAMLのリストについての簡単な要約

要するに、 YAML は人間が読める形式のデータシリアル化標準であり、構成ファイルを書き込むための簡潔で明確な方法を提供します。 YAMLの良いところは、リスト、マップ、スカラー型などの複数のデータ型をサポートしていることです。

YAMLリストの要素は「-」文字を使用して定義され、すべて同じインデントレベルを共有します。

yamlconfig:
  list:
    - item1
    - item2
    - item3
    - item4

比較として、プロパティベースの同等物はインデックスを使用します。

yamlconfig.list[0]=item1
yamlconfig.list[1]=item2
yamlconfig.list[2]=item3
yamlconfig.list[3]=item4

その他の例については、YAMLとプロパティファイルを使用してリストとマップを定義する方法に関する記事をご覧ください。

実際のところ、 YAMLの階層的な性質により、プロパティファイルと比較して読みやすさが大幅に向上します。 YAMLのもう1つの興味深い機能は、異なるSpringプロファイルに対して異なるプロパティを定義できることです。 Bootバージョン2.4.0以降、これはプロパティファイルでも可能です。

Spring BootがYAML構成のすぐに使えるサポートを提供することは言及する価値があります。 設計上、Spring Bootは、追加の作業なしで、起動時にapplication.ymlから構成プロパティをロードします。

3. YAMLリストをオブジェクトの単純なリストにバインドする

Spring Bootは、 @ConfigurationProperties アノテーションを提供して、外部構成データをオブジェクトモデルにマッピングするロジックを簡素化します。

このセクションでは、 @ConfigurationProperties YAMLリストをにバインドするリスト

application.ymlで簡単なリストを定義することから始めます。

application:
  profiles:
    - dev
    - test
    - prod
    - 1
    - 2

次に、単純な ApplicationProps POJO を作成して、YAMLリストをオブジェクトのListにバインドするロジックを保持します。

@Component
@ConfigurationProperties(prefix = "application")
public class ApplicationProps {

    private List<Object> profiles;
    
    // getter and setter

}

ApplicationProps クラスは、 @ConfigurationProperties で装飾して、指定されたプレフィックスを持つすべてのYAMLプロパティをApplicationPropsのオブジェクトにマッピングする意図を表す必要があります。

プロファイルリストをバインドするには、タイプリストのフィールドを定義するだけで、@ConfigurationPropertiesアノテーションが残りを処理します。

@Component を使用して、ApplicationPropsクラスを通常のSpringBeanとして登録していることに注意してください。 その結果、他のSpring Beanと同じ方法で、他のクラスに注入できます。

最後に、 ApplicationProps Beanをテストクラスに入れて、 プロファイル YAMLリストは正しく挿入されますリスト

@ExtendWith(SpringExtension.class)
@ContextConfiguration(initializers = ConfigDataApplicationContextInitializer.class)
@EnableConfigurationProperties(value = ApplicationProps.class)
class YamlSimpleListUnitTest {
 
    @Autowired
    private ApplicationProps applicationProps;
 
    @Test
    public void whenYamlList_thenLoadSimpleList() {
        assertThat(applicationProps.getProfiles().get(0)).isEqualTo("dev");
        assertThat(applicationProps.getProfiles().get(4).getClass()).isEqualTo(Integer.class);
        assertThat(applicationProps.getProfiles().size()).isEqualTo(5);
    }
}

4. YAMLリストを複雑なリストにバインドする

それでは、さらに深く掘り下げて、ネストされたYAMLリストを複雑な構造化されたListに挿入する方法を見てみましょう。

まず、ネストされたリストをapplication.ymlに追加しましょう。

application:
  // ...
  props: 
    -
      name: YamlList
      url: http://yamllist.dev
      description: Mapping list in Yaml to list of objects in Spring Boot
    -
      ip: 10.10.10.10
      port: 8091
    -
      email: [email protected]
      contact: http://yamllist.dev/contact
  users:
    -
      username: admin
      password: admin@10@
      roles:
        - READ
        - WRITE
        - VIEW
        - DELETE
    -
      username: guest
      password: guest@01
      roles:
        - VIEW

この例では、 小道具プロパティにリスト

>>

。 同様に、ユーザーユーザーオブジェクトのリストにマップします。

props エントリの各要素は異なるキーを保持しているため、 List of Mapとして挿入できます。 Spring BootのYAMLファイルからマップを挿入する方法に関する記事を必ず確認してください。

ただし、 users の場合、すべてのアイテムが同じキーを共有するため、マッピングを簡素化するために、キーをカプセル化するための専用のUserクラスを作成する必要があります。フィールド

public class ApplicationProps {
    
    // ...
	
    private List<Map<String, Object>> props;
    private List<User> users;
    
    // getters and setters

    public static class User {

        private String username;
        private String password;
        private List<String> roles;

        // getters and setters

    }
}

次に、ネストされたYAMLリストが適切にマッピングされていることを確認します。

@ExtendWith(SpringExtension.class)
@ContextConfiguration(initializers = ConfigDataApplicationContextInitializer.class)
@EnableConfigurationProperties(value = ApplicationProps.class)
class YamlComplexListsUnitTest {
 
    @Autowired
    private ApplicationProps applicationProps;
 
    @Test
    public void whenYamlNestedLists_thenLoadComplexLists() {
        assertThat(applicationProps.getUsers().get(0).getPassword()).isEqualTo("admin@10@");
        assertThat(applicationProps.getProps().get(0).get("name")).isEqualTo("YamlList");
        assertThat(applicationProps.getProps().get(1).get("port").getClass()).isEqualTo(Integer.class);
    }
	
}

5. 結論

この記事では、YAMLリストをJava Listにマッピングする方法を学びました。

また、複雑なリストをカスタムPOJOにバインドする方法も確認しました。

いつものように、この記事の完全なソースコードは、GitHubから入手できます。