CDIによるプロパティのインジェクション

アプリケーションの設定情報をソースコード中にハードコードするのではなく、プロパティファイルに記述しておいて後から変更できるようにしたい場合があります。このプロパティの値をCDIらしくインジェクションで取得する方法としてProducerを使う方法があります。こうやって手作りするのは良いのですが、複数の変数の型に対応させたり、拡張可能にしたりと機能を盛り込んでいくと手間がかかります。今回はこのような機能を提供するDeltaSpike Configurationについて紹介します。

DeltaSpike Configurationとは

DeltaSpike Configurationはプロパティから構成情報を取得するための機能でCoreモジュールに含まれます。アプリケーションからこれを使うのは簡単です。変数のインジェクション時に@ConigurePropertyというアノテーションを指定すると、nameで指定された名前に応じたプロパティの値を変数にインジェクションしてくれます。

@Inject
@ConfigProperty(name = "serverAddress")
String serverAddress;

デフォルト値を設定したい場合はdefaultValueも一緒に指定します。

@Inject
@ConfigProperty(name = "serverAddress" , defaultValue = "localhost")
String serverAddress;

プロパティファイルのデフォルトはMETA-INF/apache-deltaspike.propertiesです。この例では、このファイルには以下のような該当するプロパティを書いておきます。

serverAddress=192.168.0.1

実は、DeltaSpike Configurationでは、apache-deltaspike.properties以外の場所でもプロパティを設定することが可能です。プロパティを設定をする方法として以下が提供されています。複数同時に設定されている場合はordinalが大きい方が優先されます。

表1:DeltaSpike Configurationのプロパティ設定箇所
プロパティのソース ordinal 備考
システムプロパティ 400
環境変数 300
JNDI 200 “java:comp/env/deltaspike/”
プロパティファイル 100 “META-INF/apache-deltaspike.properties”

@ConfigPropertyでサポートされる型

@ConfigPropertyでサポートされる変数の型は以下になります。

  • String
  • Integer
  • Long
  • Float
  • Double
  • Boolean

カスタムの型に対応させたい場合はConfigResolver.Converterインタフェースを実装します。実装例はドキュメントを参照してください。

@ConfigPropertyの例

プロパティを取得する具体例を見てみましょう。次のような文字列と数値のプロパティをあらかじめMETA-INF/apache-deltaspike.propertiesに設定しておきます。

username=tanoseam
pollingInterval=120

以下のテストコードを実行してみます。2番目、3番目の@ConfigPropertyの型はStringではなくIntegerです。このように文字列以外の値についてはプロパティ値をターゲットの変数の型に変換してからインジェクションしてくれるので便利です。

@RunWith(CdiTestRunner.class)
@TestControl(projectStage = ProjectStage.UnitTest.class)
public class ConfigurationTest {

	@Inject
    @ConfigProperty(name = "username", defaultValue = "tanoseam")
    String username;

    @Inject
    @ConfigProperty(name = "pollingInterval", defaultValue = "60")
    Integer pollingInterval;
    
    @Inject
    @ConfigProperty(name = "nullValue")
    Integer nullValue;

	@Test
	public void testConfig() {
		assertEquals("tanoseam", username);
		assertEquals(120, pollingInterval.intValue());
		assertNull(nullValue);
    }
}

このテストは問題なく成功するはずです。

プロパティの優先順位を確認するため、テスト起動時にシステムプロパティとして別の値を設定してみましょう。

mvn test -Dusername=neverbird

こうすると、今度はテストが失敗します。システムプロパティの方がプロパティファイルよりも優先されてインジェクトされているのがわかります。

Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.475 sec <<< FAILURE!
testConfig(org.tanoseam.examples.ConfigurationTest)  Time elapsed: 0.007 sec  <<< FAILURE!
org.junit.ComparisonFailure: expected:<[tanoseam]> but was:<[neverbird]>
	at org.junit.Assert.assertEquals(Assert.java:115)
	at org.junit.Assert.assertEquals(Assert.java:144)
	at org.tanoseam.examples.ConfigurationTest.testConfig(ConfigurationTest.java:33)

 

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。