SpringMVC之@initBinder解决类型转换问题

初始化参数绑定器

由@InitBinder表示的方法,可以对WebDataBinder对象进行初始化。WebDataBinder是DataBinder的子类,用于完成由表单到JavaBean属性的绑定。

@InitBinder方法不能有返回值,它必须盛名为void。

@InitBinder方法的参数通常是WebDataBinder,

@InitBinder可以对WebDataBinder进行初始化。

例如:这里可以设置一个从网线打过来的日期  转换成date格式

@Controller
public class FirstController {
    @InitBinder
    public void initBinder(WebDataBinder binder){
        DateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
        binder.registerCustomEditor(Date.class,new CustomDateEditor(sdf,true));
    }
    @RequestMapping("/first")
    public String doFirst(String username, int age, Date birthday){
        System.out.println(username);
        System.out.println(age);
        System.out.println(birthday);
        return "suecssful";
    }
}

下边是一个InitBinder的提升版本  上边的代码只能实现一种格式的匹配

/* 
* 自定义属性编辑器  继承propertiesEditor
* */
public class EditorTest extends PropertiesEditor {
    public Date convert(String str) {
        SimpleDateFormat sdf = getDate(str);
        try {
            return sdf.parse(str);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return  null;
    }
//通过正则表达式去匹配网线打过来的字符串格式
public SimpleDateFormat getDate(String str) { SimpleDateFormat sdf=null; if(Pattern.matches("^\d{4}-\d{2}-\d{2}$",str)){ sdf=new SimpleDateFormat("yyyy-MM-dd"); } if(Pattern.matches("^\d{4}/\d{2}/\d{2}$",str)){ sdf=new SimpleDateFormat("yyyy/MM/dd"); } if(Pattern.matches("^\d{4}\d{2}\d{2}$",str)){ sdf=new SimpleDateFormat("yyyyMMdd"); } return sdf; } }

Controller的书写:

@Controller
public class FirstController {
    @InitBinder
    public void initBinder(WebDataBinder binder){
        DateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
        binder.registerCustomEditor(Date.class,new CustomDateEditor(sdf,true));
    }
    @RequestMapping("/first")
    public String doFirst(String username, int age, Date birthday){
        System.out.println(username);
        System.out.println(age);
        System.out.println(birthday);
        return "suecssful";
    }
}
原文地址:https://www.cnblogs.com/1234AAA/p/8683390.html