メッセージ

必ず必要になるであろう、メッセージの出力、管理についてSpringでこんな仕組みがあった。自分の入っていたプロジェクトでは、メッセージの出力はあるが、アプリコンテキストを直接さわる感じではないためこれとは少し異なりそう。

 
    
      
        com.techscore.spring.di.messages
        com.techscore.spring.di.errors
      
    
  

bean 要素の id 属性には "messageSource" を指定します。ApplicationContext は起動時にこの名前で MessageSource が定義されているか検索を行うため他の名前を指定してはいけません。class 属性値とプロパティ名は例と同じになるようにしてください。value 要素の内容には ApplicationContext に読み込ませるリソースバンドルを指定します。Struts などと同様にファイル名は一般的なリソースバンドルと同じ形式に従わなければなりません。

リソースバンドルってなんだろう?

(基底名)_(ロケール).properties

例では com.techscore.spring.di パッケージにある messages, errors という基底名のリソースバンドルを指定しています。list 要素を使用しているのでいくつでもリソースバンドルを ApplicationContext に読み込ませることができます。

メッセージ取得メソッドが3つほどある String getMessage(String code, Object[] args, Locale locale) など。

ためしにメッセージを出力させてみる。

beans2.xmlに以下を追加

	
    
      
        jp.co.jjjjpppp.springtest.messages
      
    

メッセージファイルとして以下を新規作成(文字コードSJIS

# messages_ja_JP.properties
startMessage=契約書を作成します。

mainを修正

/**
 * SpringFrameworkTest 2008/07/07
 */
package jp.co.jjjjpppp.springtest.impl;

import java.util.Locale;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

public class Main {

	/**
	 * @param args
	 */
	public static void main(String args) {

		String config = { "src/configerFiles/beans.xml",
				"src/configerFiles/beans2.xml" };
		
		ApplicationContext appCon = new FileSystemXmlApplicationContext(config);

		System.out.println(appCon.getMessage("startMessage", null, Locale.getDefault()));
		Man man = (Man) appCon.getBean("man");

		man.buyHouse();
	}
}

以下出力結果

?_?????????¬?μ???・?B
六本木ヒルズを建築します。
★以下の会社に協力してもらいます。
習志野建設30人2000万
国土交通省4000人20兆円
★以下のステークスホルダーが存在します。
下請け
★以下の工法で建築します
骨組み重視

あら??メッセージが文字化けしている!
とりあえずメッセージファイルにnative2ascillをかけてみる。
そして実行

契約書を作成します。
六本木ヒルズを建築します。
★以下の会社に協力してもらいます。
習志野建設30人2000万
国土交通省4000人20兆円
★以下のステークスホルダーが存在します。
下請け
★以下の工法で建築します
骨組み重視

ちゃんと出ました。なぜだろう?
ページをぱらぱら見ていてなんとなくの予想。(公式だけをみて判断したわけではないので、要注意)

Javaは内部的にUnicodeのみを使用している。通常Windowsなどでソースコードを書いた場合エンコード時にデフォルトでMS932が使用されたとみなし、それをUnicodeに変換してからコンパイルされる。

しかし、プロパティファイルの場合コンパイルされるわけではないので、そのまま使用すると文字化けしてしまう。よって使用前に手動でエンコーディングしてやる必要がある。