美文网首页我爱编程
2018-07-26 springmvc或springboot后

2018-07-26 springmvc或springboot后

作者: 张不二01 | 来源:发表于2018-07-26 13:26 被阅读947次

问题描述:前端像后台发送请求,如果接收模型中有Date类型的字段,会直接报错类似问题:
"Failed to convert property value of type 'java.lang.String' to required type 'java.util.Date' for property 'actEndTime'


那么怎么处理这种前端字符串,后台Date格式的字段呢,有三种方式如下:
  • 1, 后台用String类型字段接收,如果需要使用再换成date,简单来讲就是把模型中的字段的类型Date改为String,然后后续再做其他处理, 接收到了字符串,然后在后台通过SimpleDateformatter再转换成Date类型
上面这种方法,复杂
  • 2,使用@DateTimeFormat(pattern = “yyyy-MM-dd HH:mm:ss”)注解在实体字段上,
优点:可以灵活的定义接收的类型 
缺点很明显:不能全局统一处理,需要为每个需要转换字段都加注解太麻烦
  • 3, 写一个BaseController,每一个需要处理的controller继承这个BaseController,在BaseController里使用@InitBinder写一个全局转换日期方法:
@InitBinder
public void initBinder(ServletRequestDataBinder binder) {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    binder.registerCustomEditor(Date.class, new CustomDateEditor(sdf, true));        
}
优点:可以全局统一处理,不用再关注具体需要转换的日期字段 
缺点:只能定义一种日期类型,我定义了”yyyy-MM-dd”就没法定义”yyyy-MM-dd HH:mm:ss”, 如果我前台不同页面过来的日期格式不一样就不好办了
  • 4, 自定义DateConverterConfig实现一下spring提供的Converter,重写里面的convert方法:
@Component
public class DateConverterConfig implements Converter<String, Date> {

    private static final List<String> formarts = new ArrayList<>(4);

    static{
        formarts.add("yyyy-MM");
        formarts.add("yyyy-MM-dd");
        formarts.add("yyyy-MM-dd hh:mm");
        formarts.add("yyyy-MM-dd hh:mm:ss");
    }

    @Override
    public Date convert(String source) {
        String value = source.trim();
        if ("".equals(value)) {
            return null;
        }
        if(source.matches("^\\d{4}-\\d{1,2}$")){
            return parseDate(source, formarts.get(0));
        }else if(source.matches("^\\d{4}-\\d{1,2}-\\d{1,2}$")){
            return parseDate(source, formarts.get(1));
        }else if(source.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}$")){
            return parseDate(source, formarts.get(2));
        }else if(source.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}:\\d{1,2}$")){
            return parseDate(source, formarts.get(3));
        }else {
            throw new IllegalArgumentException("Invalid boolean value '" + source + "'");
        }
    }

    /**
     * 格式化日期
     * @param dateStr String 字符型日期
     * @param format String 格式
     * @return Date 日期
     */
    public  Date parseDate(String dateStr, String format) {
        Date date=null;
        try {
            DateFormat dateFormat = new SimpleDateFormat(format);
            date = dateFormat.parse(dateStr);
        } catch (Exception e) {

        }
        return date;
    }

}
springboot项目通过@Component注解将这个类交给spring容器托管的,如果springmvc项目还需要到xml配置文件注册这个类 
优点很明显了:足够灵活,在静态代码块里自定义任意格式日期,在重写的方法里在配上对应的正则表达式就行,也可以做到全局统一处理

相关文章

网友评论

    本文标题:2018-07-26 springmvc或springboot后

    本文链接:https://www.haomeiwen.com/subject/spavmftx.html