複数ファイルのアップロードでエラー その2

すこし調べたので、メモっとく。

やっぱ、StrutsSAStruts両方もっと勉強しといたほうがいいな。^^);

まず配列にアノテーションうんぬんは無関係ぽい。

あと現象としては、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リクエストは飛んでくるのでやっかいですね。
うーん、これはアプリ側でチェックする話なのかな。