[Seasar-user:4265] Re: diconファイルからinitファイル読み込み

Hideaki Suzuki [E-MAIL ADDRESS DELETED]
2006年 8月 5日 (土) 15:37:00 JST


鈴木(belltree)です。

補足(蛇足?)です。 ^^;;;

どうしてもpropertiesファイルじゃなきゃイヤ!という場合には、
こんな方法もあります。

■propertiesファイル: [org/seasar/trick/resource/env.properties]
jdbc.driver.class=org.hsqldb.jdbcDriver
jdbc.url=jdbc:hsqldb:hsql://localhost:9001
jdbc.user=sa
jdbc.password=

■環境設定用diconファイル: [org/seasar/trick/resource/env.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>
  <component name="ENV">
    @org.seasar.framework.util.ResourceUtil@
      getProperties("org/seasar/trick/resource/env.properties")
  </component>
</components>

■利用側diconファイル: [org/seasar/trick/resource/env.test.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="org/seasar/trick/resource/env.dicon"/>
  <component name="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName">ENV["jdbc.driver.class"]</property>
    <property name="url">ENV["jdbc.url"]</property>
    <property name="username">ENV["jdbc.user"]</property>
    <property name="password">ENV["jdbc.password"]</property>
  </component>
</components>

また、Springの
org.springframework.beans.factory.config.PropertyPlaceholderConfigurer
みたいに、複数のpropertiesファイルを指定して、後勝ちルールで、
プロパティ値をオーバーライドしたい場合には、こんな感じでできます。
  <component name="ENV" class="java.util.Properties">
    <initMethod name="load">
      <arg>
        @org.seasar.framework.util.ResourceUtil@
          getResourceAsStream("org/seasar/trick/resource/env1.properties")
      </arg>
    </initMethod>
    <initMethod name="load">
      <arg>
        @org.seasar.framework.util.ResourceUtil@
          getResourceAsStream("org/seasar/trick/resource/env2.properties")
      </arg>
    </initMethod>
  </component>


PropertyPlaceholderConfigurerのignoreResourceNotFoundプロパティをtrueに
設定した場合の挙動を再現するには、もう1工夫必要かも…
たとえば、こんな感じのクラスを作って…

package org.seasar.trick.resource;

import java.io.IOException;
import java.util.Properties;

import org.seasar.framework.exception.IORuntimeException;
import org.seasar.framework.exception.ResourceNotFoundRuntimeException;
import org.seasar.framework.util.ResourceUtil;

public class PropertiesMixer extends Properties {

	private static final long serialVersionUID = -7578337136933134477L;

	private boolean ignoreResourceNotFound = false;
	
	public void ignoreResourceNotFound() {
		ignoreResourceNotFound = true;
	}
	
	public void load(String path) {
		if (!ResourceUtil.isExist(path)) {
			if (ignoreResourceNotFound) {
				return;
			} else {
				throw new ResourceNotFoundRuntimeException(path);
			}
		}
		try {
			load(ResourceUtil.getResourceAsStream(path));
		} catch (IOException e) {
			throw new IORuntimeException(e);
		}
	}
	
}

こんな感じで設定するとか…

  <component name="ENV" class="org.seasar.trick.resource.PropertiesMixer">
    <initMethod name="ignoreResourceNotFound"/>
    <initMethod name="load"><arg>"org/seasar/trick/resource/env1.properties"</arg></initMethod>
    <initMethod name="load"><arg>"org/seasar/trick/resource/env2.properties"</arg></initMethod>
    <initMethod name="load"><arg>"org/seasar/trick/resource/env3.properties"</arg></initMethod>
  </component>


ちなみにOGNLのMap書式を使って、こんな感じで指定することも可能です。
値の取得方法は、上記と同じです。
  <component name="ENV">
    #{
      "jdbc.driver.class" : "org.hsqldb.jdbcDriver",
      "jdbc.url"          : "jdbc:hsqldb:hsql://localhost:9001",
      "jdbc.user"         : "sa",
      "jdbc.password"     : ""
    }
  </component>

ご参考までに。。。

p.s.
上記コードはご自由にご利用下さい。

/** 
 * @auther Hideaki Suzuki
 * @contact [E-MAIL ADDRESS DELETED]
 */




Seasar-user メーリングリストの案内