在Spring中自定义PropertyEditorSupport

时间:2013-02-09 16:30:06

标签: spring validation spring-mvc property-editor

我正在使用Spring 3.2。为了全局验证double值,我使用CustomNumberEditor。确实已经进行了验证。

但是当我输入1234aaa123aa45之类的数字时,我希望NumberFormatException被抛出,但事实并非如此。文档说,

  

如果指定字符串的开头不能,则引起ParseException   解析

因此,上面提到的这些值被解析为它们被表示为数字,然后省略字符串的其余部分。

为避免这种情况,并使其抛出异常,当这些值被提供时,我需要通过扩展question中提到的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())不会在服务器控制台上打印任何内容。

我已经尝试了question的所有答案中描述的所有方法,但没有一个对我有效。我在这里错过了什么?这是否需要在某些xml文件中配置?

1 个答案:

答案 0 :(得分:2)

显然,你没有通过StrictNumericFormat引用。你应该注册你的编辑器:

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

BTW Spring 3.X引入了一种实现转换的新方式:Converters