Failed to convert from type [java.lang.String] to type [@javax.persistence.Transient java.util.Date]

Failed to convert from type [java.lang.String] to type [@javax.persistence.Transient java.util.Date] for value ‘2020-08-23’

原因:springboot可以自动识别yyyy/MM/dd格式的时间字符串并注入Date类型的属性中,但不能识别yyyy-MM-dd等格式的字符串

解决方法:在属性上标注传入的格式
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date date2;
如果需要同时接收多种格式,可以自定义一个类实现Converter接口:

import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@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 + "'");
        }
    }


    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;
    }
}

这样就可以就收多种格式的字符串时间了


版权声明:本文为jerry_wzj_原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。