Spring Framework 入門記 Beanその9 PropertyEditorだよ

その8」でBeanFactoryのカスタマイズができました.後は,PropertyEditorの実装クラスを用意すれば,BigDecimal対応はすぐにでもできそうなので,先にやってしまいます.
まずjava.beans.PropertyEditorですが,これまで作ったことがないので随分大変そうだなぁ,とJavaDocを見てため息が出てしまいました.ところが,Springが用意しているFileEditorのソースを見ると,PropertyEditorSupportを継承していて,自分で実装しなければならないメソッドは2つだけなんですね.しかもかなり単純.
こんな感じです.

package study;
import java.beans.PropertyEditorSupport;
import java.math.BigDecimal;

public class BigDecimalEditor extends PropertyEditorSupport {
    public void setAsText(String text) throws IllegalArgumentException {
        setValue(new BigDecimal(text));
    }
    public String getAsText() {
        return getValue().toString();
    }
}

次は,CustomEditorConfigurerを使用してBeanFactoryに組み込まなくてはなりません.
CustomEditorConfigurerは,プロパティの型とその型を扱うPropertyEditorMapsetCustomEditors(Map)メソッドで設定してあげればいいようです.
ということで,BeanFactoryカスタマイズ用定義ファイルに次を追加!

    <bean id="customEditorConfigurer" 
        class="org.springframework.beans.factory.config.CustomEditorConfigurer"
    >
        <property name="customEditors">
            <map>
                <entry key="java.math.BigDecimal">
                    <bean class="study.BigDecimalEditor"/>
                </entry>
            </map>
        </property>
    </bean>

今度は<map>要素を使ってしまいました.新しいPropertyEditorを作ったら,<entry>要素を追加してあげればいいわけですね.
次にBigDecimal型のプロパティを持つBeanを作成します(ソースは省略).
Beanの定義ファイルをこんな感じにして...

    <bean name="foo" class="study.Foo">
        <property name="number"><value>100.00</value></property>
    </bean>

実行すると,しっかりプロパティに値を設定することができました.
BigDecimalEditorのコードを見ると,BigDecimalに特化しないで,Stringの引数を1つだけ持つコンストラクタがあり,toString()で文字列化できるクラスなら何でもオッケーってした方が良さそうですね.