Spring MVCのConverterとFormatter入門!型変換の仕組みと拡張ポイントをわかりやすく解説
生徒
「Spring MVCって、リクエストパラメータを自動で変換してくれるって聞いたんですが、どういう仕組みなんですか?」
先生
「Springでは、ConverterやFormatterという仕組みを使って、文字列をJavaオブジェクトに変換したり、逆に整形してくれるんです。」
生徒
「なるほど!でも、それって自分でカスタマイズもできるんですか?」
先生
「はい、自分で独自のConverterやFormatterを実装すれば、自由に型変換のルールを追加できますよ。詳しく見ていきましょう。」
1. Spring MVCにおける型変換の仕組み
「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の登録方法
「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. よく使われるユースケースと具体例
「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でバインドされる時に、自動で型変換が行われています。つまり、型変換はフォーム処理を支える重要な仕組みなのです。
まとめ
「まとめ」の重要ポイントを、初心者の方にも分かりやすく簡潔に解説します。
Spring MVCの型変換を総復習
Spring MVCにおける型変換は、Webアプリケーション開発において非常に重要な役割を担っています。HTTPリクエストは基本的に文字列として送信されますが、実際のアプリケーションでは日付型や数値型、さらには独自クラスなどのオブジェクトとして扱う必要があります。この変換処理を自動で行ってくれるのが、ConverterとFormatterという仕組みです。
Converterはシンプルに一方向の型変換を担当し、主に文字列から数値や日付、IDからエンティティへの変換などに使われます。一方でFormatterは、入力値の解析と画面表示時のフォーマットの両方を担当できるため、ユーザーインターフェースに関わる場面で非常に強力な役割を持ちます。
特に実務では、日付や金額の表示形式を統一したいケースや、フォーム入力時のフォーマットを柔軟に扱いたいケースが多くあります。そのような場合にFormatterを使うことで、入力と出力のロジックを一元管理でき、保守性の高いコードを書くことができます。
実務で役立つ設計ポイント
Spring MVCの型変換機能を活用することで、コントローラのコードをシンプルに保つことができます。例えば、コントローラ内で毎回手動でパース処理を書く必要がなくなり、ビジネスロジックに集中することができます。
また、WebMvcConfigurerを使った登録によって、アプリケーション全体で共通の変換ルールを適用できる点も大きなメリットです。これにより、複数の画面やAPIで一貫したデータ処理が可能になります。
さらに、独自のConverterやFormatterを実装することで、ドメインに特化した変換ロジックを柔軟に追加できます。例えば、ユーザーIDからユーザー情報を取得するConverterや、日本語形式の日付を扱うFormatterなど、実際の業務に即した実装が可能です。
サンプルプログラムで理解を深める
public class CustomStringToIntegerConverter implements Converter<String, Integer> {
@Override
public Integer convert(String source) {
if (source == null || source.isEmpty()) {
return 0;
}
return Integer.parseInt(source);
}
}
public class CustomNumberFormatter implements Formatter<Integer> {
@Override
public Integer parse(String text, Locale locale) {
return Integer.parseInt(text.replace(",", ""));
}
@Override
public String print(Integer object, Locale locale) {
return String.format("%,d", object);
}
}
上記のサンプルでは、文字列から整数への変換と、カンマ区切りの数値フォーマットを実現しています。このように、ConverterとFormatterを組み合わせることで、柔軟かつ実用的なデータ処理が可能になります。
フォームバインドとの連携
Spring MVCでは、フォームから送信されたデータは自動的にオブジェクトにバインドされます。この際にConverterやFormatterが内部的に利用されており、開発者が意識しなくても型変換が行われています。
しかし、独自の仕様が必要な場合は、自分で変換処理を定義することで、より精密な制御が可能になります。特にバリデーションと組み合わせることで、安全で使いやすい入力処理を実現できます。
理解を深めるポイント整理
- Converterは単方向の型変換に特化している
- Formatterは入力と出力の両方を扱える
- WebMvcConfigurerで簡単に登録できる
- フォームバインドと密接に連携している
- 実務では独自実装が重要になる
生徒
Spring MVCの型変換について理解できました。これまでコントローラで手動で変換していた処理が不要になるのはとても便利ですね。
先生
その通りです。ConverterやFormatterを使うことで、コードの責務を分離できるのが大きな利点です。特に保守性の向上に直結します。
生徒
Formatterは表示にも関係するという点が印象的でした。画面表示まで考えた設計ができるのは強いですね。
先生
はい。ユーザーに見える部分と内部処理をきれいに分けられるので、実務では非常に重要です。特に日付や金額などはFormatterの出番です。
生徒
独自のConverterを作れば、IDからオブジェクトを取得するような処理も自動化できるんですよね。
先生
その通りです。ドメインロジックに合わせて変換ルールを定義できるのがSpringの強みです。ぜひ実際の開発でも活用してみてください。
Spring FrameworkやThymeleafを使った Webアプリ開発の全体像をやさしく理解したい人には、 この入門書が定番です。
Spring Framework超入門をAmazonで見る※ Amazon広告リンク