私は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
好奇心から、クラス内のクラスからオーバーライドされたメソッドが呼び出されることはなく、これらのメソッド内で指定されているように出力をコンソールにリダイレクトするステートメント (および) は、サーバー コンソールに何も出力しません。PropertyEditorSupport
StrictNumericFormat
getAsText()
setAsText()
その質問のすべての回答に記載されているすべてのアプローチを試しましたが、うまくいきませんでした。ここで何が欠けていますか?一部のxmlファイルで構成する必要がありますか?