0

私はSpring 3.2で作業しています。double 値をグローバルに検証するために、 を使用しますCustomNumberEditor。検証は実際に実行されます。

しかし、 などの数値を入力する1234aaaと、 がスローされること123aa45を期待しNumberFormatExceptionていますが、そうではありません。ドキュメントによると、

指定された文字列の先頭が解析できない場合、ParseException が発生します。

したがって、上記のような値は、数値として表現されるまで解析され、残りの文字列は省略されます。

これを回避し、そのような値が供給されたときに例外をスローさせるには、この質問PropertyEditorSupportで述べたように、クラスを拡張して独自のプロパティ エディターを実装する必要があります。

package numeric.format;

import java.beans.PropertyEditorSupport;

public final class StrictNumericFormat extends PropertyEditorSupport
{
    @Override
    public String getAsText() 
    {
        System.out.println("value = "+this.getValue());
        return ((Number)this.getValue()).toString();
    }

    @Override
    public void setAsText(String text) throws IllegalArgumentException 
    {
        System.out.println("value = "+text);
        super.setValue(Double.parseDouble(text));
    }
}

アノテーションで注釈を付けたメソッド内で指定したエディターは次の@InitBinderとおりです。

package spring.databinder;

import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.Format;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.beans.propertyeditors.CustomNumberEditor;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.context.request.WebRequest;

@ControllerAdvice
public final class GlobalDataBinder 
{
    @InitBinder
    public void initBinder(WebDataBinder binder, WebRequest request)
    {
        DateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
        dateFormat.setLenient(false);
        binder.setIgnoreInvalidFields(true);
        binder.setIgnoreUnknownFields(true);
        //binder.setAllowedFields("startDate");
        binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));

        //The following is the CustomNumberEditor

        NumberFormat numberFormat = NumberFormat.getInstance();
        numberFormat.setGroupingUsed(false);
        binder.registerCustomEditor(Double.class, new CustomNumberEditor(Double.class, numberFormat, false));
    } 
}

Spring 3.2 を使用しているので、@ControllerAdvice


好奇心から、クラス内のクラスからオーバーライドされたメソッドが呼び出されることはなく、これらのメソッド内で指定されているように出力をコンソールにリダイレクトするステートメント (および) は、サーバー コンソールに何も出力しません。PropertyEditorSupportStrictNumericFormatgetAsText()setAsText()

その質問のすべての回答に記載されているすべてのアプローチを試しましたが、うまくいきませんでした。ここで何が欠けていますか?一部のxmlファイルで構成する必要がありますか?

4

1 に答える 1

2

明らかに、参照をどこにも渡していませんStrictNumericFormat。次のようにエディターを登録する必要があります。

 binder.registerCustomEditor(Double.class, new StrictNumericFormat());

ところで、Spring 3.X は、変換を実現する新しい方法を導入しました:コンバーター

于 2013-02-10T09:44:56.780 に答える