code up

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

SAStrutsにてSizeLimitExceededExceptionでindexが呼び出されない

好まざる事でも仕事であれば使わなければいけない。今の開発で使用しているフレームワークがSeasar2なのもそのひとつ。

ファイルアップロード時の上限サイズ(struts-config.xml/maxFileSize)を超えた時(SizeLimitExceededException)にindex()に制御が移るか呼び出したいサービスが呼び出されるかの違いについて。

ドキュメントによると常にindexに制御が移るっぽいようなことが書いてあるけど、違うような気がする。

URLにメソッドが指定されているケース

<form action="upload/process">
	<input type="file" name="file" />
	<button type="submit">送信</button>
</form>

この場合、indexに制御は移らずUploadActionのprocessメソッドが常に呼び出される。

URLにメソッドが含まれないケース

<form action="upload">
	<input type="file" name="file" />
	<button type="submit" name="process">送信</button>
</form>

この場合、indexに制御が移る。制限値が小さいサイズだとひょっとしたらprocessメソッドが呼び出されるかもしれない。

その理由と対応

きちんとStrutsやSAStruts、commons-fileuploadのソースを読んだわけではないので推測だが、 URLにメソッド名を含めた場合はHTTPリクエストの本体(Body)を読み込む前に呼び出すメソッドが決定するからそのメソッドを呼び出すことができる。

対してURLでなくパラメータにメソッド名を含めた場合は、マルチパートな本体にアップロードしているファイルと一緒にそのメソッド名が前後にあり、SizeLimitExceededExceptionが発生した時点で解析(parse)処理を中断するから呼び出し先のメソッド名が物理的に取得できないということなんでしょう。

つまりAction側を汎用的に作るのであればindex()にも本来呼び出されるメソッドにもSizeLimitExceededExceptionの確認は必要。両方のメソッドをテストする場合はメソッド名をURLに含めるかパラメータに含めるかで切り替える。

関連記事
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。