在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);