Spring MVCのConverterとFormatter入門!型変換の仕組みと拡張ポイントをわかりやすく解説
生徒
「Spring MVCって、リクエストパラメータを自動で変換してくれるって聞いたんですが、どういう仕組みなんですか?」
先生
「Springでは、ConverterやFormatterという仕組みを使って、文字列をJavaオブジェクトに変換したり、逆に整形してくれるんです。」
生徒
「なるほど!でも、それって自分でカスタマイズもできるんですか?」
先生
「はい、自分で独自のConverterやFormatterを実装すれば、自由に型変換のルールを追加できますよ。詳しく見ていきましょう。」
1. Spring MVCにおける型変換の仕組み
Spring MVCでは、HTTPリクエストのパラメータは基本的に文字列として受け取られます。しかし、実際にコントローラで扱いたいのは日付や数値、独自クラスなどのオブジェクト型です。そこで登場するのが型変換(Type Conversion)の仕組みです。
Springではこの型変換の処理をConverterやFormatterといったインターフェースを使って内部的に行っており、開発者はこれらを使ってカスタマイズすることができます。
2. Converterとは?基本の型変換インターフェース
org.springframework.core.convert.converter.Converterは、1つの型から別の型に変換するためのシンプルなインターフェースです。たとえば、StringからLocalDateに変換したい場合に使えます。
public class StringToLocalDateConverter implements Converter<String, LocalDate> {
@Override
public LocalDate convert(String source) {
return LocalDate.parse(source, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
}
}
このようなクラスを作成し、Springに登録することで、フォームの入力文字列をLocalDateに変換して扱えるようになります。
3. Formatterとは?表示と解析の両方を扱う仕組み
SpringにはFormatterというインターフェースもあります。これは型変換だけでなく、文字列へのフォーマット(整形)も行うことができます。
public class LocalDateFormatter implements Formatter<LocalDate> {
@Override
public LocalDate parse(String text, Locale locale) {
return LocalDate.parse(text, DateTimeFormatter.ofPattern("yyyy/MM/dd"));
}
@Override
public String print(LocalDate object, Locale locale) {
return object.format(DateTimeFormatter.ofPattern("yyyy/MM/dd"));
}
}
Formatterはparseとprintの2つのメソッドを実装することで、双方向の変換が可能になります。特に画面に表示する際に整形が必要な場合に便利です。
4. 独自Converterの登録方法
作成したConverterは、WebMvcConfigurerのaddFormattersメソッドを使って登録します。
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(new StringToLocalDateConverter());
}
}
このように設定することで、Spring MVCは自動的にリクエストパラメータを指定した型に変換してくれるようになります。
5. 独自Formatterの登録と活用方法
FormatterもaddFormattersメソッドで登録できます。たとえば、日付を「2025/09/04」のようなフォーマットで表示・入力させたい場合は次のようにします。
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addFormatter(new LocalDateFormatter());
}
}
このようにFormatterを使うことで、入力チェックと出力整形の両方をスマートに実装できます。
6. ConverterとFormatterの違いを整理しよう
Converterは「変換のみ(片方向)」、Formatterは「変換+表示(双方向)」です。
- Converter:数値やIDなどの変換処理に最適
- Formatter:日付や金額など、表示形式が重要な項目に最適
どちらを使うかは、アプリケーションの要件によって選びましょう。
7. よく使われるユースケースと具体例
実務でよく使われるユースケースをいくつか紹介します。
- ユーザーのID文字列をUserオブジェクトに変換(Converter)
- 画面で日付を「yyyy年MM月dd日」形式に表示(Formatter)
- 金額を「#,###円」で表示しつつ、数値として処理(Formatter)
こうした型変換をうまく使うことで、入力と出力の処理をすっきり整理できます。
8. Spring Bootでも同じように使える?
Spring BootでもWebMvcConfigurerを使えば同じようにConverterやFormatterを登録できます。Bootの自動設定に頼るだけでなく、必要に応じて明示的に設定を追加することで、より細かい制御が可能になります。
たとえば、複数の日付フォーマットに対応したり、エラー時のログを出力するようにすることで、実務でのトラブルも未然に防げます。
9. フォームバインドと型変換の関係
Spring MVCの@ModelAttributeやBindingResultといったフォームバインドの仕組みと、ConverterやFormatterは密接に連携しています。
たとえば、ユーザーが入力した文字列が@ModelAttributeでバインドされる時に、自動で型変換が行われています。つまり、型変換はフォーム処理を支える重要な仕組みなのです。