今回はメッセージリソースの使い方を紹介する。
フォルダ構成
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>
実行結果
message:名前を入力してください。
以上。
Spring徹底入門 Spring FrameworkによるJavaアプリケーション開発
- 作者:株式会社NTTデータ
- 出版社/メーカー: 翔泳社
- 発売日: 2016/07/21
- メディア: 大型本