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