end0tknr's kipple - 新web写経開発

http://d.hatena.ne.jp/end0tknr/ から移転しました

Spring Boot for java で yamlな設定ファイル( application.yml )を参照

https://end0tknr.hateblo.jp/entry/20180114/1515907344

以前の上記エントリーの再編集でポイントは以下の通り。

  • aplication.properties の代わりに application.yml があると、Spring Boot が自動認識
  • snake caseで記載しても、camel case として認識
  • 今回、記載していませんが、環境変数:SPRING_PROFILES_ACTIVE=dev 等により application-dev.yml のような設定に切り替え可能

参考url

https://www.saka-en.com/java/spring-boot-read-yaml/

https://www.saka-en.com/java/spring-boot-get-yaml-value/

サンプルアプリの構成

今回は、 application.yml の内容を CommonConf.java で読み、 Controller1.javajson形式で出力(といっても単なるdump)します。

src/main/java/
  jp.end0tknr/       ---1)
    SpringBootDomaApplication.java ---2)
    Controller1.java ---3)
  jp.end0tknr.conf/  ---4)
    CommonConf.java  ---5)   
src/main/resources/  ---6)
  application.yml    ---7)
build.gradle         ---8)  
  • 1),2) : spring bootがproject追加時に自動作成 (私は何もしていません)
  • 3) : 設定fileの内容をjsonで返すrest controller
  • 4),5) : 設定fileへのアクセサ?
  • 6),7) : 設定file
  • 8) : 特別な変更は行っていませんが、参考として build.gradle を記載

application.yml

以下のようにサンプルを用意しました。 spring.datasource.~ は、value を変更することでmysqlへも接続できます。

spring:
  datasource:
    url: jdbc:mysql://192.168.244.101:3306/xing?useSSL=false&zeroDateTimeBehavior=convertToNull
    username: xingadm
    password: xxxxxxx
    driver-class-name: com.mysql.cj.jdbc.Driver
common:
  app_root_url: https://www.google.co.jp
  login_url: https://www.yahoo.co.jp
  news_list:
    - top
    - tech
    - economy
    - weather

CommonConf.java

application.yml を読むためのもので、ポイントは「@Component」と 「@ConfigurationProperties(prefix="common")」。

「@Data」は、lombok によるアクセサメソッド自動生成の為のものです。

package jp.end0tknr.conf;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import lombok.Data;

@Component
@ConfigurationProperties(prefix="common")
@Data
public class CommonConf {
    private String appRootUrl;
    private String loginUrl;
    private String[] newsList;
}

Controller1.java

設定内容の渡し方は様々ですが、今回は、commonConf に @Autowired し、 commonConf をそのまま return することで、json 形式で返しています。

package jp.end0tknr;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import jp.end0tknr.conf.CommonConf;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@RestController
public class Controller1 {

    private static final Logger logger =
            LoggerFactory.getLogger(Controller1.class);

    @Autowired
    private CommonConf commonConf;
    
    @RequestMapping("/")
    public String index() {
        return "Hello Spring Boot !!" + commonConf.getAppRootUrl();
    }

    @RequestMapping("/dumpconf")
    public CommonConf dumpConf() {
        return commonConf;
    }

}```


# dump結果

ブラウザで、http://localhost:8080/dumpconf へアクセスすると、
次のように表示されます。

** application.yml では、snakeで記載しましたが、camelで表示されています。 **

{"appRootUrl":"https://www.google.co.jp", "loginUrl":"https://www.yahoo.co.jp", "newsList":["top","tech","economy","weather"]}

※ 視認性を良くする為、上記には改行を入れ、整形しています **