[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 メーリングリストの案内