map集合封装bean对象问题

问题: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;

    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值