spring自动类型转换========Converter和PropertyEditor

Posted Hei-po

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring自动类型转换========Converter和PropertyEditor相关的知识,希望对你有一定的参考价值。

Spring有两种自动类型转换器,一种是Converter,一种是propertyEditor。

两者的区别:Converter是类型转换成类型,Editor:从string类型转换为其他类型。

从某种程度上,Converter包含Editor。如果出现需要从string转换到其他类型。首选Editor。

Converter代码展示:

实现string类型转换Date。

MyConverter类

public class MyConverter implements Converter<String, Date> {

    public Date convert(String source) {
        System.out.println("进入了 converter");
        //创建类型转换器
        @SuppressWarnings("unused")
        SimpleDateFormat simpleDateFormat = getSimpleDateFormat(source);
        Date date = null;
        try {
            date = simpleDateFormat.parse(source);
        } catch (ParseException e) {
            e.printStackTrace();
        }

        return date;
    }

    private SimpleDateFormat getSimpleDateFormat(String source) {
        SimpleDateFormat simpleDateFormat;
        if (Pattern.matches("^\\d{4}-\\d{2}-\\d{2}$", source)) {
            simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        } else if (Pattern.matches("^\\d{4}/\\d{2}/\\d{2}$", source)) {
            simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd");
        } else if (Pattern.matches("^\\d{4}\\d{2}\\d{2}$", source)) {
            simpleDateFormat = new SimpleDateFormat("yyyyMMdd");
        } else {
            throw new TypeMismatchException("", Date.class);
        }

        return simpleDateFormat;
    }

}

 

Controller类

 

@Controller
@RequestMapping("/student")
public class StudentController {
    @RequestMapping("/add")
    public ModelAndView add(Student student) {
        System.out.println(student.getName());
        System.out.println(student.getBirthday());
        return new ModelAndView("success");

    }

    @ExceptionHandler
    public ModelAndView exceptionMethod(Exception ex, ModelAndView mv, HttpServletRequest request) {
        System.out.println("进入新增界面");
        //获取前台输入的信息
        String name = request.getParameter("name");
        String birthday = request.getParameter("birthday");
        String message = ex.getMessage();
        if (message.contains(name)) {
            mv.addObject("nameerro", "用户名输入有误");

        }
        if (message.contains(birthday)) {
            mv.addObject("birthdayerro", "日期输入有误");
        }
        mv.addObject("name", name).addObject("birthday", birthday).setViewName("index");
        return mv;
    }

}

纠结了一下,还是决定写一下Editor的代码,然后打一局魂斗罗,希望多年后的自己还可以这么喜欢这款游戏。

尴尬了,原来还可以加行号。。。

 1 @Controller
 2 @RequestMapping("/student")
 3 public class StudentController {
 4     @RequestMapping("/add")
 5     public ModelAndView add(Student student) {
 6         System.out.println(student.getName());
 7         System.out.println(student.getBirthday());
 8         return new ModelAndView("success");
 9 
10     }
11 
12     /**
13      * binder.registerCustomEditor初始化参数的绑定 newcustomDateEditor:创建类型编辑器 true
14      * 允许日期格式为空
15      * 
16      */
17     @InitBinder
18     public void initBinder(WebDataBinder binder) {
19         binder.registerCustomEditor(Date.class, new MyEditor());
20     }
21 }

 

public class MyEditor extends PropertiesEditor {
    @Override
    public void setAsText(String source) throws IllegalArgumentException {
        SimpleDateFormat sdf = getDate(source);
        Date parse = null;
        // 类型转化
        try {
            parse = sdf.parse(source);
            setValue(parse);
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }

    /**
     * @param source
     *            传递来的日期格式的字符串
     * 
     */
    private SimpleDateFormat getDate(String source) {
        SimpleDateFormat sdf = new SimpleDateFormat();
        // 判断
        if (Pattern.matches("^\\d{4}-\\d{2}-\\d{2}$", source)) {
            sdf = new SimpleDateFormat("yyyy-MM-dd");
        } else if (Pattern.matches("^\\d{4}/\\d{2}/\\d{2}$", source)) {
            sdf = new SimpleDateFormat("yyyy/MM/dd");
        } else if (Pattern.matches("^\\d{4}\\d{2}\\d{2}$", source)) {
            sdf = new SimpleDateFormat("yyyyMMdd");
        } else {
            /**
             * 都不匹配了 就让它抛出 TypeMismatchException异常 public
             * TypeMismatchException(Object value, Class<?> requiredType) {
             * vallue 值能对应requiredType 类型 就不会出现异常 我们就得写一个不能转换的
             */
            throw new TypeMismatchException("", Date.class);
        }
        return sdf;
    }
}

自我感觉:Editor代码量比Controller少,但还是都记不住。。。

我去魂斗罗了哈哈哈。。。

仔细看了一下,纠正一下,并不是Controller代码量多,在页面设置了回显,所以代码多了。但是还是不太明白,return、date date=null,date parse=null。下午讨论以后,在写感受。

以上是关于spring自动类型转换========Converter和PropertyEditor的主要内容,如果未能解决你的问题,请参考以下文章

关于springmvc怎么自动把前台string类型日期字段转换成date类型

spring中页面传递参数为Date类型自动转换为字符串的方法

Spring Boot | 集成MapStruct实现不同类型Java对象间的自动转换

Spring MVC 之类型转换

Spring MVC中自定义类型转换器(Date)

Spring MVC中自定义类型转换器(Date)