山崎屋の技術メモ

IT業界で働く中で、気になること、メモしておきたいことを書いていきます。

【Spring Framework】メッセージリソースを使う

f:id:yyama1556:20160812103358p:plain

今回はメッセージリソースの使い方を紹介する。

フォルダ構成

f:id:yyama1556:20160813112019p:plain

messages_ja_JP.properties

msg={0}を{1}してください。

これで"msg"というキーを指定することにより対応する文字列を取得できる。

メッセージを取得する際に動的に変える文字列は、{0}のようにして指定する。

Fugaクラス

package org.yyama.hoge;

import java.util.Locale;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.stereotype.Component;

@Component
public class Fuga {
	@Autowired
	MessageSource messages;

	public void proc() throws Exception {
		System.out.println("message:" + messages.getMessage("msg", new String[] { "名前", "入力" }, Locale.getDefault()));
	}
}

MessageSourceクラスのインスタンスを保持する変数"messages"を宣言し、@Autowiredアノテーションを付与して、SpringにDIしてもらう。

メッセージを取得するには、getMessageメソッドを呼び出す。第一引数はメッセージのキー。第二引数はプレースフォルダに挿入するString配列。第三引数はロケール

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="
      http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans.xsd
      http://www.springframework.org/schema/context
      http://www.springframework.org/schema/context/spring-context.xsd">
	<context:component-scan base-package="org.yyama.hoge" />
	<context:property-placeholder location="classpath*:myProp.properties" />
	<bean id="messageSource"
		class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
		<property name="basename" value="classpath:messages" />
		<property name="defaultEncoding" value="UTF-8" />
	</bean>
</beans>

メッセージリソースを使うために必要な箇所を抜粋すると以下のとおり。

	<bean id="messageSource"
		class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
		<property name="basename" value="classpath:messages" />
		<property name="defaultEncoding" value="UTF-8" />
	</bean>

idは"messageSource"でなければいけない。Springがこのidが存在した場合、メッセージソースとして認識する。

basenameでメッセージファイルの場所を指定する。

defaultEncodingは文字化け対策のため。私の環境ではこれを外すと文字化けしてしまう。

複数のメッセージファイルを指定したければ以下のように修正する。

	<bean id="messageSource"
		class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
		<property name="basenames">
			<list>
				<value>messages</value>
				<value>messages2</value>
			</list>
		</property>
		<property name="defaultEncoding" value="UTF-8" />
	</bean>

3行目は"basename"ではなく"basenames"なので注意する。

Mainクラス

package org.yyama;

import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.yyama.hoge.Fuga;

public class Main {
	public static void main(String... args) throws Exception {
		ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
		ctx.getBean(Fuga.class).proc();
		ctx.close();
	}
}

特別なことはしていない。FugaクラスのインスタンスをSpringコンテナから取得し、proc()メソッドを実行している。

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>org.springframework.samples</groupId>
	<artifactId>Sample</artifactId>
	<version>0.0.1-SNAPSHOT</version>

	<properties>
		<!-- Generic properties -->
		<java.version>1.8</java.version>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<!-- Spring -->
		<spring-framework.version>4.3.2.RELEASE</spring-framework.version>
	</properties>
	<dependencies>
		<!-- Spring and Transactions -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${spring-framework.version}</version>
		</dependency>
	</dependencies>
</project>