概要
前回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");