Spring Boot 定義ファイル読込

Spring Bootアプリケーションで定義ファイルの値をString型以外で取得してみた

Spring Bootアプリケーションでは、application.propertiesの値を@Valueアノテーションを利用して取得できるが、定義ファイルから取得した値は、String型以外も利用できる。

今回は、定義ファイルから取得した数値を、Integer型・int型・String型の各値に格納してみたので、そのサンプルプログラムを共有する。

前提条件

下記記事の実装が完了していること。

IntelliJ IDEA上でGradleを使ってWeb画面のSpring Bootプロジェクトを作成してみたSpring Bootのプロジェクトを新規作成を「IntelliJ IDEA」のメニューから実施しようとしたところ、無料の「Commun...

サンプルプログラムの構成

作成したサンプルプログラムの構成は以下の通り。
サンプルプログラムの構成
なお、上記の赤枠は、今回作成・変更したプログラムである。

application.propertiesの内容は以下の通りで、各プロパティ値を定義している。

server.port = 8084

# プロパティファイルの各設定値
test.integer.prop1=10
test.integer.prop2=
test.int.prop3=8
test.int.prop4=
test.string.prop5=6
test.string.prop6=

また、Spring Bootのメインクラスの内容は以下の通りで、Demoサービスクラスを呼び出している。

package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication implements CommandLineRunner {

    /**
     * プロパティファイルから取得した値を表示するサービス
     */
    @Autowired
    private DemoService demoService;

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @Override
    public void run(String... args) {
        // プロパティファイルから取得した値を表示する
        demoService.getProp();
    }

}

さらに、Demoサービスクラスの内容は以下の通りで、プロパティファイルの値を、Integer型・int型・String型それぞれで読み込んでいる。

package com.example.demo;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

@Service
public class DemoService {

    @Value("${test.integer.prop1}")
    private Integer prop1;

    @Value("${test.integer.prop2}")
    private Integer prop2;

    @Value("${test.int.prop3}")
    private int prop3;

    //int型の場合、空文字だとエラーになる
    //@Value("${test.int.prop4}")
    private int prop4;

    @Value("${test.string.prop5}")
    private String prop5;

    @Value("${test.string.prop6}")
    private String prop6;

    /**
     * プロパティの各値を取得し表示する
     */
    public void getProp(){
        System.out.println("prop1の値 : " + prop1);
        System.out.println("prop2の値 : " + prop2);
        System.out.println("prop2はNULLか? : " + (prop2 == null));
        System.out.println();

        System.out.println("prop3の値 : " + prop3);
        System.out.println("prop4の値 : " + prop4);
        System.out.println();

        System.out.println("prop5の値 : " + prop5);
        System.out.println("prop6の値 : " + prop6);
        System.out.println("prop6は空文字か? : " + "".equals(prop6));
    }

}

サンプルプログラムの実行結果

サンプルプログラムの実行結果は、以下の通り。

1) Demoサービスクラスのprop4の@Valueアノテーションを、以下の赤枠のようにコメントアウトした状態にする。
サンプルプログラムの実行結果_1

2) 1)の状態でDemoサービスクラスの「DemoApplication.java」を実行した結果は以下の通りで、prop1,prop3,prop5は取得した各値が、prop2にはNULL値が、prop6には空文字が、それぞれ設定されることが確認できる。
サンプルプログラムの実行結果_2

3) Demoサービスクラスのprop4の@Valueアノテー-ションを、以下の赤枠のようにコメントアウトを外した状態にする。
サンプルプログラムの実行結果_3

4) 3)の状態でDemoサービスクラスの「DemoApplication.java」を実行した結果は以下の通りで、UnsatisfiedDependencyExceptionがスローされることが確認できる。
サンプルプログラムの実行結果_4

要点まとめ

  • Spring Bootアプリケーションで取得したプロパティファイルの値は、Integer型など、String型以外も利用できる。
  • 定義ファイルから取得した値が空文字だった場合、Integer型の変数にはNULL値が、String型の変数には空文字が、それぞれ設定される。