在BeanUtils注册自定义类型转换规则转换bean map

使用org.apache.commons.beanutils.BeanUtils.describe可以将bean转换为Map<String,String>,但是某些特殊类型在通过BeanUtils.populate转换时会报错,例如JAVA8的LocalDateTime

org.apache.commons.beanutils.ConversionException: Default conversion to java.time.LocalDateTime failed.

解决

注册转换器

// 覆盖默认的String类型转换器,将LocalDateTime类型属性转换为时间戳文本
BeanUtilsBean.getInstance().getConvertUtils().register(new AbstractConverter() {
    @Override
    protected <T> T convertToType(final Class<T> type, final Object value) throws Throwable {
        if (String.class.equals(type) || Object.class.equals(type)) {
            return type.cast(value.toString());
        }
        throw conversionException(type, value);
    }

    @Override
    protected Class<?> getDefaultType() {
        return String.class;
    }

    @Override
    protected String convertToString(Object value) throws Throwable {
        if (value instanceof LocalDateTime) {
            return String.valueOf(((LocalDateTime) value).atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
        } else {
            return super.convertToString(value);
        }
    }
}, String.class);
// 注册LocalDateTime类型转换器,将时间戳文本转换为LocalDateTime
BeanUtilsBean.getInstance().getConvertUtils().register(new Converter() {
    @Override
    public <T> T convert(Class<T> type, Object value) {
        if (value == null) {
            return null;
        }
        return (T) LocalDateTime.ofInstant(Instant.ofEpochMilli(Long.valueOf((String) value)), ZoneId.systemDefault());
    }
}, LocalDateTime.class);

posted on 2022-04-11 22:39  路过君  阅读(444)  评论(0编辑  收藏  举报

导航