複数ファイルのアップロードでエラー その2
すこし調べたので、メモっとく。
やっぱ、StrutsとSAStruts両方もっと勉強しといたほうがいいな。^^);
まず配列にアノテーションうんぬんは無関係ぽい。
あと現象としては、id:ooharakさんが報告したものと同件ですね。
エラーの原因は、
FormFileの配列に空ファイルがあるとバリデーションが効かずActionMessagesが空になり、
Actionまで処理が進んでエラーとなるため。
バリデーションが効かないのはStrutsの仕様っぽい。
単一ファイルをアップロードし(配列でない)FormFIleで受け取る場合は問題ない。
というのも何も選択せずにアップロードすると、ファイル名が空なので、バリデーションでひっかかる。
複数ファイルアップロードの場合は、空ファイルがあると、バリデーション対象が[aaa.txt, ]のようになって、
全体として空ではないので、エラーにならない(この例では1つめがaaa.txt、2つめが空)。
2つとも空の場合は、[, ]というふうになる。
これをorg.apache.struts.validator.FieldChecksのvalidateRequiredメソッドでチェックしているのだが、
GenericValidator.isBlankOrNullがfalseになり、ActionMessagesにaddされない(valueが[, ])。
単一ファイルの場合はvalueが""となるのでaddされる。
String value = null; if (isString(bean)) { value = (String) bean; } else { value = ValidatorUtils.getValueAsString(bean, field.getProperty()); } if (GenericValidator.isBlankOrNull(value)) { errors.add(field.getKey(), Resources.getActionMessage(validator, request, va, field)); return false; } else { return true; }
MacBookでコマンド+シフト+4でデバッグ状況をキャプチャーした結果が以下。見にくいな。^^);
何も選択しなくてもhttpリクエストは飛んでくるのでやっかいですね。
うーん、これはアプリ側でチェックする話なのかな。