2

モデルは次のとおりです。

public class myFormData {
    private BigDecimal trackingNumber;

    @Valid
    private List<myCustomRecord> records = new ArrayList<myCustomRecord>();
}

public class myCustomRecord {
    //the field also appears here (for child records)
    private BigDecimal trackingNumber;
}

ある時点でこのオブジェクトを受け取って保存するコントローラーメソッドがあります。

public @ResponseBody ValidationResponse save(Model model,
        @Valid myFormData formData, BindingResult result,
        HttpSession session){
       //do stuff
}

私が抱えている問題は、文字列がtrackingNumberフィールドに渡された場合、エラーメッセージが良くないことです。

タイプ「java.lang.String」のプロパティ値を、プロパティ「records[0].trackingNumber」に必要なタイプ「java.math.BigDecimal」に変換できませんでした。ネストされた例外は java.lang.NumberFormatException です

タイプ「java.lang.String」のプロパティ値を、プロパティ「trackingNumber」に必要なタイプ「java.math.BigDecimal」に変換できませんでした。ネストされた例外は java.lang.NumberFormatException です

もう 1 つの潜在的な問題は、いくつかの ajax 送信を行おうとしているために、Spring フォームを使用していないことです。これは私がデータを提出する方法です:

function collectFormData(fields) {
    var data = {};

    //myFormData
    data["trackingNumber"] = <<some value here>>;

    for (var i = 0; i < fields.length; i++) {
        data["records["+i+"].trackingNumber"] = <<some value>>; 
        //some more data to submit for child records
    }
    return data;
}

var mData = collectFormData(aSelectedRows);
if (aSelectedRows.length> 0) {
    $.post('call_controller_save', mData, function(response) {
     if (response.status === 'FAIL') {
         displayError(response);
     } else {
        //SAVE SUCCESSFUL
        $('#successMsgs').append("Data Saved");
    }, 'json');
} 

trackingNumberのデータ型を に変更Stringして、カスタムを作成してみましたConstraintValidator<CheckNumeric, String>。それはうまくいきます... を介してカスタムメッセージを入れることができますがValidationMessages.properties、モデルを意図したデータ型に忠実に保ちたいと思います。 エラー メッセージを制御し、ユーザー フレンドリーなメッセージに変更する別の方法はありますか?

(また、検証ステップの前に、データバインディングで最も可能性が高いことも理解していNumberFormatExceptionますか?しかし、デフォルトメッセージを修正する方法はまだわかりません)

編集 次の構成を使用します

<bean class="org.springframework.context.support.ResourceBundleMessageSource"
    id="messageSource">
    <property name="basenames">
        <list>
            <value>messages</value>
            <value>ValidationMessages</value>
        </list>
    </property>
</bean>

各プロパティ ファイルには、同じ内容が含まれています。

formData.trackingNumber=Invalid format

しかし、カスタム メッセージはまだ取得されていません。 質問 2 :formDataまたは? myFormDataクラス名なのか、jsp ページで使用されているフォーム オブジェクトの名前なのか混乱しています。

4

2 に答える 2

4

検証メッセージに追加 - この種の形式は、提供されたテキストを数値に変換できない場合、Spring によってデフォルトで使用されます。

typeMismatch.java.math.BigDecimal=Required format is number.
于 2013-02-28T19:17:16.610 に答える
0

この場合、validate() の呼び出しの前に発生するため、検証エラー メッセージを制御する方法はないと思います。

私たちにできることは、

  1. validationError.properties を定義する

  2. formData.trackingNumber=Invalid Formatのようなカスタム エラー メッセージを表示する

  3. p:basename を validationError として、org.springframework.context.support.ResourceBundleMessageSource クラスの Spring Bean を定義します。

于 2013-02-27T04:52:24.200 に答える