コンテンツへスキップ

SAStrutsで外だし設定ファイルを利用する方法(S2configを使う)

概要

前回SAStrutsで独自のpropertiesファイルを使う方法を紹介しました。

ただ前回の方法では以下のようなことはできません。

  • 組み込みdicon(ex:JDBC.dicon)の設定値を独自のconfig.propertiesファイルに指定した内容でセット
  • dev環境とproduction環境でconfigファイルを自動的に切り替え

 

上記のことを行うにはS2configプラグインを入れると便利です。

設定方法を記載します。

設定方法

jarの取得

公式サイトから以下2つのjarをダウンロードします。

  • s2config-core-1.0.3.jar
  • s2config-extension-1.0.3.jar

ダウンロードしたjarはWEB-INF/libに配置して

ビルドパスに追加してください。

 

各種設定

resources/app.diconに以下の記述を追加します

<include path="config.dicon"/>

resources/config.diconを作成して以下を記述します

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
	"http://www.seasar.org/dtd/components24.dtd">
<components>
  <include path="s2config-core.dicon"/>

  <component name="configContainer" class="org.seasar.config.core.container.impl.StrictConfigContainer">
    <arg>
      <component class="org.seasar.config.core.container.impl.ConfigContainerImpl" autoBinding="none"/>
    </arg>
    <!-- read config.properties file -->
    <property name="configName">"config"</property>
  </component>
</components>

configNameに指定した名前(ここではconfig)が対象のpropetiesファイルになります。

今回はconfig.propertiesというファイルに設定値を書くことにするのでこうなります。

 

resources/configCustomize.diconを作成して以下を記述

このファイルはS2configにより自動的に読み込まれます

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
	"http://www.seasar.org/dtd/components24.dtd">
<components>
  <component class="org.seasar.config.core.config.impl.ConfigPropertiesWriter" instance="prototype"/>
  <component class="org.seasar.config.core.config.impl.ConfigPropertiesReader" instance="prototype"/>
</components>

次にresources/creator.diconに以下を追記

<component class="org.seasar.config.core.creator.ConfigCreator"/>

resources/customizer.diconに以下を追記

<component name="configCustomizer" class="org.seasar.framework.container.customizer.CustomizerChain"/>

次にweb.xmlに以下を記述

どっちもfilter/filter-mappingが記載されているあたりに追記してください。

また、hotdeployfilterより下に記述する必要があるとのことです(公式より)

    <filter>
        <filter-name>configFilter</filter-name>
        <filter-class>org.seasar.config.extension.servlet.filter.ConfigFilter</filter-class>
        <init-param>
          <param-name>targetURIs</param-name>
          <param-value>.*</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>configFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

これでS2configを利用する準備ができました。

 

S2configを使ってみる

例としてJDBC.diconに記述しているデータベース接続情報を

config.propertiesの設定で書き換えるようにしてみます。

JDBC.diconを以下のように記述します。

  <include path="config.dicon"/>
	<!-- for PostgreSQL -->
  <component name="xaDataSource"
      class="org.seasar.extension.dbcp.impl.XADataSourceImpl">
      <property name="driverClassName">
        configContainer.findAllConfigValue("jdbc.driver", "org.postgresql.Driver")
      </property>
      <property name="URL">
        configContainer.findAllConfigValue("jdbc.url", "jdbc:postgresql://localhost:5432/demo")
      </property>
      <property name="user">configContainer.findAllConfigValue("jdbc.user", "sa")</property>
      <property name="password">configContainer.findAllConfigValue("jdbc.password", "")</property>
  </component>

設定値のところが configContainer.findAllConfigValue()になっています。

第1引数がconfig.propetiesに記載する設定値のキー名、

第2引数がなかった場合のデフォルト値です。

 

つぎにconfig.propetiesです。

# ----------------------------------
# Environment
# ----------------------------------
# テスト環境の場合、コメントイン
# (config_dev.propertiesで上書き)
#env=dev

# ----------------------------------
# For JDBC
# ----------------------------------
jdbc.driver=org.postgresql.Driver
jdbc.url=jdbc:postgresql://hoge.net:5432/demo
jdbc.user=sa
jdbc.password=

jdbc.xxxxの部分がJDBC.diconで記載した内容と対応しています。

こんな感じでセットしていくことができるわけですね。

 

また、env=devの設定部分をコメントインすると

  • config.propertiesを読み込み
  • config_dev.propertiesがあれば読み込み、同一キーは上書き

という動きをするようになります。

このことからresources/config_dev.propertiesファイルを作成し

# Custom Setting For Develop Environment

# ----------------------------------
# For JDBC
# ----------------------------------
jdbc.driver=org.postgresql.Driver
jdbc.url=jdbc:postgresql://dev.hoge.net:5432/demo
jdbc.user=sa
jdbc.password=

というように記述しておけばdev環境ではconfig.propertiesとconfig_dev.propertiesを両方持ち、

production環境ではconfig.propertiesのみを持つことで

環境によるデータベースの切り替えを実現することができます。

 

Javaコードからconfigを取得する

最後にコードよりconfigを取得する際のサンプルです。

@Resource
protected ConfigContainer config;

...

String user = config.findAllConfigValue(String.class, "jdbc.user");

コメントを残す

メールアドレスが公開されることはありません。