问题:map转bean时,string类型数据不能直接映射为localDateTime类型,报错信息为 argument type mismatch
。
解决方案:在自定义的 “将map value值映射为实体类中字段的方法” 中添加对于localDateTime类型数据的判断和手动映射。
核心代码:
if (LocalDateTime.class.getName().equals(fieldTypeClass.getName())) {
String newStr = String.valueOf(value).substring(0, 19).replaceAll("T"," ");
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
retVal = LocalDateTime.parse(newStr,df);
}
完整代码:
public class ConventUtil {
/**
* 利用反射将map集合封装成bean对象
* @param map
* @param clazz
* @return
*/
public static <T> T mapToBean(Map<String, Object> map, Class<?> clazz) throws Exception {
Object obj = clazz.newInstance();
if (map != null && !map.isEmpty() && map.size() > 0) {
for (Map.Entry<String, Object> entry : map.entrySet()) {
String propertyName = entry.getKey(); // 属性名
Object value = entry.getValue(); // 属性值
String setMethodName = "set" + propertyName.substring(0, 1).toUpperCase() + propertyName.substring(1);
Field field = getClassField(clazz, propertyName); //获取和map的key匹配的属性名称
if (field == null || value == null) {
continue;
}
Class<?> fieldTypeClass = field.getType();
value = convertValType(value, fieldTypeClass);
try {
clazz.getMethod(setMethodName, field.getType()).invoke(obj, value);
} catch (NoSuchMethodException e) {
logger.error(e.getMessage());
}
}
}
return (T) obj;
}
/**
* 根据给定对象类匹配对象中的特定字段
*
* @param clazz
* @param fieldName
* @return
*/
private static Field getClassField(Class<?> clazz, String fieldName) {
if (Object.class.getName().equals(clazz.getName())) {
return null;
}
Field[] declaredFields = clazz.getDeclaredFields();
for (Field field : declaredFields) {
if (field.getName().equals(fieldName)) {
return field;
}
}
Class<?> superClass = clazz.getSuperclass(); //如果该类还有父类,将父类对象中的字段也取出
if (superClass != null) { //递归获取
return getClassField(superClass, fieldName);
}
return null;
}
/**
* 将map的value值转为实体类中字段类型匹配的方法
*
* @param value
* @param fieldTypeClass
* @return
*/
private static Object convertValType(Object value, Class<?> fieldTypeClass) {
Object retVal = null;
if (Long.class.getName().equals(fieldTypeClass.getName())
|| long.class.getName().equals(fieldTypeClass.getName())) {
retVal = Long.parseLong(value.toString());
} else if (Integer.class.getName().equals(fieldTypeClass.getName())
|| int.class.getName().equals(fieldTypeClass.getName())) {
retVal = Integer.parseInt(value.toString());
} else if (Float.class.getName().equals(fieldTypeClass.getName())
|| float.class.getName().equals(fieldTypeClass.getName())) {
retVal = Float.parseFloat(value.toString());
} else if (Double.class.getName().equals(fieldTypeClass.getName())
|| double.class.getName().equals(fieldTypeClass.getName())) {
retVal = Double.parseDouble(value.toString());
} else if (LocalDateTime.class.getName().equals(fieldTypeClass.getName())) {
String newStr = String.valueOf(value).substring(0, 19).replaceAll("T"," ");
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
retVal = LocalDateTime.parse(newStr,df);
}else if(LocalDate.class.getName().equals(fieldTypeClass.getName())) {
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd");
retVal = LocalDate.parse((CharSequence) value,df);
}else {
retVal = value;
}
return retVal;
}
}