リクエストのパース

リクエストパラメータは以下の順序でフォームオブジェクトにバインドされます。

  1. リクエストをパースしてリクエストパラメータを Map<String, Object[]> へ変換
  2. Map<String, Object[]> をフォームオブジェクトにバインド

ここでは1.のリクエストをパースして Map<String, Object[]> へ変換する処理をカスタマイズする方法について解説します。

使用例として、RESTful サービスがあります。
ボディ部が XML である application/atom+xml 形式のリクエストを XML パーサをもつ独自のクラスでパースし、Map に変換することで XML の内容をフォームオブジェクトにバインドすることが可能になります。

RequestParser

コンテナに登録されている RequestParser を実装したクラスがリクエストのパースを行います。
このインターフェイスにはリクエストを処理できるかを判断する isParsable と、優先順位を返す getPriority() が定義されています。
複数のインスタンスがコンテナに登録された場合にリクエストを処理するインスタンスを決定するため、 getPriority() で取得する優先順位が低い順に isParsable でリクエストを判断し、最初に true を返したインスタンスによってリクエストを処理します。
標準の状態では DefaultRequestParserImpl がコンテナに登録されて(cubby.dicon)いて、通常のリクエストはすべてこのインスタンスが処理します。

提供されている RequestParser

標準では以下の RequestParser の実装クラスを提供しています。

DefaultRequestParserImpl

デフォルトの RequestParser です。
特に何も設定を行わない場合にはこのクラスがすべてのリクエストをパースします。

デフォルトとして動作するために、メソッド isParsable() は常に true を返し、 メソッド getParameterMap() は、ServletRequest#getParameterMap() の結果をそのまま返します。
そして、優先順位を一番低くするために優先順位のデフォルト値として Integer#MAX_VALUE が設定されてます。

このクラスは cubby.dicon に登録されているので常にコンテナに登録されます。

MultipartRequestParserImpl

このクラスは commons-fileupload によって multipart リクエストの解析を行います。
HTMLフォームからファイルをアップロードする時などに使用する multipart/form-data 形式のリクエストを処理するためにはこのクラスを使用してください。

form タグの enctype が multipart/form-data のリクエストのときに isParsable() は true を返し、このクラスによってリクエストが解析されます。
優先順位のデフォルト値として DefaultRequestParserImpl よりひとつ少ない値が設定されます。

app-cubby.dicon に、このクラスと ServerFileUploadServletRequestContext を登録することで commons-fileupload によるファイルアップロード使用可能になります。

詳細な設定方法は diconファイル (WEB-INF/classes) を参照してください。