1前書き

Spring Bootの便利な機能の1つは、外部化された設定と、プロパティファイルで定義されたプロパティへの簡単なアクセスです。

以前のリンク:/properties-with-spring[article]は、これを行うことができるさまざまな方法を説明していました。この記事では、

@ ConfigurationProperties

アノテーションについてさらに詳しく説明します。


2セットアップ

この記事の設定はかなり標準的です。まず、

pom.xml

に親として

spring-boot-starter-parent

を追加します。

<!-- Inherit defaults from Spring Boot -->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.2.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

Spring Bootの最新版は、中央のhttps://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-parent[ここ]にあります。

ファイルに定義されているプロパティを検証できるようにするには、JSR-303の実装が必要です。

hibernate-validator

はそのうちの1つです。

それを私たちの

pom.xml

にも追加しましょう。

<dependency>
   <groupId>org.hibernate</groupId>
   <artifactId>hibernate-validator</artifactId>
   <version>5.4.1.Final</version>
</dependency>

アプリケーションの種類と実行している環境によっては、1つ以上の依存関係を追加する必要があるかもしれません。

reference

ページに同じことについての詳細があり、

hibernate-validator

の最新版はhttps://mvnrepository.com/artifact/orgにあります。 hibernate/hibernate-validator[ここ]。

このアノテーションの全機能を理解するために、メールサーバに関連する設定プロパティを持つ仮想クラスの例を取ります。

public class ConfigProperties {

    public static class Credentials {
        private String authMethod;
        private String username;
        private String password;

      //standard getters and setters
    }
    private String host;
    private int port;
    private String from;
    private Credentials credentials;
    private List<String> defaultRecipients;
    private Map<String, String> additionalHeaders;

   //standard getters and setters
}


3設定プロパティのバインド

  • 公式ドキュメントによると、設定プロパティを

    @ ConfigurationProperties

    ** のアノテーションが付けられた別のPOJOに分離することをお勧めします。それでは、まず始めに

@Configuration
@ConfigurationProperties
public class ConfigProperties {
   //previous code
}

また、Springに

@ Configuration

アノテーションを追加して、このBeanを見つけてインジェクションの候補にできるようにしました。

アノテーションは、すべて同じプレフィックスを持つ階層プロパティがある場合に最も効果的に機能するので、プレフィックスもアノテーションの一部として説明します。

これらのプロパティを格納するカスタムソースをオプションで定義することもできます。そうしないと、デフォルトの場所(

classpath:application.properties

)が検索されます。そこで、今度は上記のアノテーションを既存のプロパティクラスに追加します。

@Configuration
@PropertySource("classpath:configprops.properties")
@ConfigurationProperties(prefix = "mail")
public class ConfigProperties {
   //previous code
}

  • それだけです!** プロパティファイルで定義されたプロパティのうち、接頭辞

    mail

    とプロパティの1つと同じ名前を持つものは、自動的にこのオブジェクトに割り当てられます。

また、デフォルトでは、緩やかなバインディングスキームがバインディングに採用されているので、以下のバリエーションはすべて

Credentials

クラスのプロパティ

authMethod

にバインドされます。

mail.credentials.auth__method
mail.credentials.auth-method
mail.credentials__AUTH__METHOD
mail.CREDENTIALS__AUTH__METHOD

同様に、

List

および

Map

プロパティもバインドできます。これは、前に定義した

ConfigProperties

オブジェクトに正しくバインドするサンプルのプロパティファイルです。

#Simple properties[email protected]mail.port=9000[email protected]
#List properties
mail.defaultRecipients[0][email protected]mail.defaultRecipients[1][email protected]
#Map Properties
mail.additionalHeaders.redelivery=true
mail.additionalHeaders.secure=true

#Object properties
mail.credentials.username=john
mail.credentials.password=password
mail.credentials.authMethod=SHA1


4プロパティ検証

このアノテーションが提供する便利なことの1つは、JSR-303フォーマットを使用したプロパティの検証です。これは、プロパティが

null

ではないことをチェックするなど、あらゆる種類のきれいなことを可能にします。

@NotBlank
private String host;


String

プロパティの最小長と最大長も確認できます。

@Length(max = 4, min = 1)
private String authMethod;

あるいは、

Integer

プロパティの最小値と最大値を強制します。

@Min(1025)
@Max(65536)
private int port;

そして最後に、同じ正規表現を定義することで、プロパティが特定のパターンに一致することを確認することもできます。例として、これは電子メールに対して行われました。

@Pattern(regexp = "^[a-z0-9.__%+-][email protected][a-z0-9.-]+\\.[a-z]{2,6}$")
private String from;

これにより、コード内のさまざまな

if – else

条件を減らすことができ、非常にきれいで簡潔に見えます。

  • これらの検証のいずれかが失敗した場合、メインアプリケーションは不正なプロパティが修正されるまで

    IllegalStateException

    ** で起動できません。

また、関連するプロパティにアクセスするためにバリデータフレームワークによって使用されるため、各プロパティに対してゲッターとセッターを宣言することも重要です。


5結論

このクイックチュートリアルでは、@ @ ConfigurationProperties__アノテーションを調べ、リラックスバインディングやBean Validationなどの便利な機能もいくつか紹介しました。

いつものように、コードはhttps://github.com/eugenp/tutorials/tree/master/spring-boot[Githubで利用可能]です。