7.型変換のカスタマイズ
(Spring3.0から追加された機能ConversionService)
概要
Spring の設定ファイルはXMLですので、単なる文字列です。
普通で考えると、Springの設定ファイルに記述されたオブジェクトはすべて文字列(String)になるはずです。
しかし実際には、プロパティ(setter)の型がStringでもintでも正しく設定されます。
Springが文字列(String)から他の型への型変換の仕方を知っていて、適切に変換をかけているからです。
逆に言うとSpringの知らない型変換は行えません。
ここでは、新しく作った型変換を追加する方法を見てみましょう。
最初に言っておくと、ここで紹介するのはSpring3.0から追加されたConversionServiceという機能です。
型変換の基本
Springではデフォルトで、int, String, NumberなどのJavaの基本型を相互に変換する方法を持っています。
また配列⇒Listへの変換も、genericの型などを調べて自動で行ってくれます。
これらの変換はSpringのコンテナがConversionServiceを利用して隠れて行っているため、通常、開発者には見えにくい部分です。
まずは、このクラスを明示的に使用する例を見てみましょう。
【型変換ConversionServiceのサンプル】
/*
ConversionServiceは、下記のように自分でインスタンスを作るか、
もしくはプロパティとしてConversionServiceを宣言し、@Autowiredを使用してAutowireすれば取得可能です。
*/
FormattingConversionServiceFactoryBean factoryBean = new FormattingConversionServiceFactoryBean();
factoryBean.afterPropertiesSet();
ConversionService conversionService = factoryBean.getObject();
//Javaの通常の型に対する変換
int num = conversionService.convert("100", int.class); //⇒数値の100になる
String s = conversionService.convert(120, String.class); //⇒文字列"120"になる
boolean b = conversionService.convert("false", boolean.class); //⇒falseになる
String[] ary = conversionService.convert("a,b,c", String[].class); //⇒{"a", "b", "c"} 文字列配列になる
List<String> list = conversionService.convert("aa", List.class); //⇒{"aa"} 文字列のListになる
<ConversionServiceについて>
まず、ConversionServiceの取得方法ですが、コメントに記述したとおりです。
取得さえしてしまえば、staticメンバとしてクラスに持っておいても大丈夫です。
javadocによると、ConversionServiceの派生クラスはスレッドセーフに作るべき、ということが書かれているので
おそらくSpringが提供する派生クラスはスレッドセーフになっているはずです。
<型変換について>
上記を見て分かるかと思いますが、たいていのJavaの型はプリミティブな型も含めて変換可能になっています。
もしかしたら、String[] の変換は「あれっ?」って思われた方もいるかも知れませんね。
"a,b,c"という文字列が3つの要素を持つ配列になっています。Springは、カンマ区切りの文字列を配列の要素として扱います。
ただし、Listについては違いますのでご注意ください。
このような型変換をシームレスに行っているのです。
以下では、新たな型変換を追加してみましょう。
型変換の追加
型変換カスタマイズの基本
型変換の追加は簡単です。
主に以下の流れになります。
①Converterクラスなどの変換用のインタフェースをimplementsしたクラスを実装する
②Springの設定ファイルで、ConversionServiceFactoryBeanを利用してSpringにConverterを登録する
たったこれだけす。
以下では文字列を自作のPOJOに変換するサンプルを見てみましょう。
サンプル(自作POJOとその変換方法の実装)
【自作POJOのサンプル】
class public Sample{
private String name;
public void setName(String name){
this.name = name;
}
}
【変換方法の実装サンプル】
public class MySampleConverter implements Converter<String, Sample> {
@Override
public Sample convert(String str) {
if(str == null) return null;
//文字列をnameプロパティとして扱うという変換をします
Sample ret = new Sample();
ret.setName(str);
return ret;
}
}
変換は、文字列⇒Sampleオブジェクト を提供します。
上記では文字列をnameプロパティとして扱っています。
他にも、例えば、"name=あいう,age=17"という形式を自分で分解してSampleオブジェクトに設定する、というアイデアもあると思います。
このあたりは自由に決められます。
これで変換の実装は終了です。
【補足】
Converterインターフェースの場合は、変換対象は1つの型です。
もし、String以外にもintや、Propertiesなど多数の型からSampleクラスに変換をかけたい場合、
その数だけConverterクラスを作らなければなりません。
それが面倒なときは、GenericConverter を使うことを考えてみても良いと思います。
サンプル(カスタマイズした型変換をSpringに登録する方法)
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="com.my.SampleConverter" />
</list>
</property>
</bean>
上記のようにSpringの設定ファイルに記述するだけです。
複数登録できます。
【使用例】
<bean id="test" class="com.my.Test">
<property name="sample" value="太郎" />
</bean>
sampleプロパティの型がSampleクラスであれば自作したConverterが使用されて変換されます。
Created Date: 2011/11/03