Spring Boot でシステム/アプリケーションプロパティを確認する

Spring Boot のアプリケーション設定を確認する

一緒に仕事をさせて頂いているベーシストのMさんが、Spring Boot でシステムプロパティ、及び、アプリケーションプロパティを確認するための方法を見つけてくれたので紹介します。

はじめに

また Spring Boot ネタです。

Spring Boot では application.properties や application.yml でアプリケーションの設定を記述する事が可能です。

ここでは Spring Boot 固有の設定はもちろん、実装するアプリケーション固有の設定を追加する事も可能であり、便利に使う事ができる訳ですが、

今設定どうなってんだっけー!?

となった事が一度くらいはあるのではないでしょうか。

テスト環境等自分が構築した訳ではない環境で、こういった事が起こりやすいのではないかと思います。
開発/構築担当者に質問したり、サーバにログインして設定内容を確認する事も可能でしょうが、

Webアプリ上からサクッと確認できたら便利

ですよね。
という訳でこれを実現するための手順に関して説明します。

環境

こちらで確認した環境は以下です。

Spring Boot 1.3.5

テンプレートエンジンには Thymeleaf を使ってます。

手順

以下に手順を示します。

プロパティ表示用コントローラの作成

以下クラス ( DebugController ) を作成します。

package jp.co.agilegroup.sample.controller;

import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.MutablePropertySources;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.context.support.StandardServletEnvironment;
import org.springframework.web.servlet.ModelAndView;

/**
 * Debug Controller.
 */
@Controller
@RequestMapping("debug")
public class DebugController {

    /** Environment variables. */
    @Autowired
    private StandardServletEnvironment environment;

    /**
     * Show application properties.
     */
    @SuppressWarnings("unchecked")
    @RequestMapping(path = "appconf", method = RequestMethod.GET)
    public ModelAndView appconf() {

        MutablePropertySources propertySources = environment
                .getPropertySources();
        final String applicationConfigName = "applicationConfig: [classpath:/application%s.properties]";
        final Map<String, Object> appConf = (Map<String, Object>) propertySources
                .get(String.format(applicationConfigName, ""))
                .getSource();
        for (String name : environment.getActiveProfiles()) {
            appConf.putAll((Map<String, Object>) propertySources.get(
                    String.format(applicationConfigName, "-" + name))
                    .getSource());
        }
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("debug");
        modelAndView.addObject("title", "Application Properties");
        modelAndView.addObject("environment", environment);
        modelAndView.addObject("appConf", appConf);
        return modelAndView;
    	
    }

    /**
     * Show system properties.
     */
    @RequestMapping(path = "sysprop", method = RequestMethod.GET)
    public ModelAndView sysProp() {

        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("debug");
        modelAndView.addObject("title", "System Properties");
        modelAndView.addObject("environment", environment);
        modelAndView.addObject("appConf", environment.getSystemProperties());
        return modelAndView;
    }
}

Thymeleaf テンプレートの作成

プロパティ表示用の Thymeleaf テンプレート ( debug.html ) を作成します。

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
      xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3"
      lang="ja">
  <head>
    <meta charset="utf-8"/>
    <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
    <meta name="viewport" content="width=device-width, initial-scale=1"/>
    <title th:text="${title}"></title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" />
  </head>
  <body>
    <div class="container">
      <div class="row">
        <h1 th:text="${title}">title</h1>
        <p>Environment : <span th:text="${environment}">environment</span></p>
        
        <table class="table table-striped table-bordered">
          <thead>
            <tr>
              <th>Key</th>
              <th>Value</th>
            </tr>
          </thead>
          <tbody>
            <tr th:each="key : ${appConf.keySet()}">
              <td class="key" th:text="*{key}">key</td>
              <td class="value" th:text="${appConf.get(key)}">value</td>
            </tr>
          </tbody>
        </table>
      </div>
    </div>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" ></script>
  </body>
</html>

機能概要

一応機能に関して簡単に説明します。

アプリケーションプロパティの一覧表示

上記コードの場合、application.properties で設定しているプロパティの一覧を表示します。

Application properties

properties ではなく yml を使っている場合には、以下のように変更して下さい。

        final String applicationConfigName = "applicationConfig: [classpath:/application%s.yml]";

プロファイルに対応

Spring Boot では環境変数でプロファイルを切り替える事が可能です。

設定のための手順を簡単に示します。

  • 環境変数 SPRING_PROFILES_ACTIVE を設定する。
    以下例
    SPRING_PROFILES_ACTIVE=staging
    
  • デフォルトのプロパティファイル (application.properties、または、application.yml) を作成する。
    デフォルト設定はここに記載する。
  • プロファイル設定名に併せた properties ( 又は yml ) ファイルを作成し ( application-staging.properties、 application-production.yml 等 )、環境毎に異なる設定はこれに記載する。

上記コントローラのコードはこのプロファイル設定も対応しています。
興味があれば、実際にプロファイルを切り替えて、プロパティが正しく表示されるか確認してみてください。

考慮すべき点

書くまでもない事かと思いますが。

アプリケーション、及び、システムの設定がダダ漏れになるので、公開範囲を適切に制限した方がよいでしょう。

  • 公開するプロファイルを制限する
    アプリケーション設定で debug-view=true/false 等設定し、この値が false の場合エラーにする
  • 認証かける
  • アクセス元のIP制限する

まとめ

Mさん記事化許可して頂きありがとうございます。m(_._)m