vo与po对象互相转换的通用方法

需求

最近遇到的一个需求,将前端传入的excel进行导入。
问题在于:导入时是用一个excelVO进行接收,但是最终保存数据库的对象应该是PO。
之前的同事写的是每个VO转PO都需要写一个新的方法,这样代码功能都是一样的,只是转换的对象不一样,过于重复。
所以!秉承着[不会偷懒的程序员不是好测试]的原则,写一个VO转PO的通用工具类,避免大量重复呆板的工作。
vo是指返回给前端的对象,po是实体类。

step1

写一个类与类转换的通用方法
需要注意的是,vo和po的属性应该有一部分是有交集的

public class CustomerConvert {

    /**
     * 类型转换
     * @param obj
     * @param clazz
     * @return
     * @throws Exception
     */
    public static Object convert(Object obj, Class clazz) throws Exception {
        Object targetObj = clazz.getDeclaredConstructor().newInstance();
        Class<?> originClass = obj.getClass();
        Field[] fields = originClass.getDeclaredFields();

        for (Field field : fields) {
            if(notValidField(field) || isStaticModifier(field)) {
                continue;
            }
            field.setAccessible(true);
            Object fileAtr = field.get(obj);

            Field field1 = clazz.getDeclaredField(field.getName());
            if(notValidField(field1)) {
                continue;
            }
            field1.setAccessible(true);
            field1.set(targetObj,fileAtr);
        }

        return targetObj;
    }

    private static boolean notValidField(Field field) {
        return Objects.isNull(field);
    }

    private static boolean isStaticModifier(Field field) {
        return Modifier.isStatic(field.getModifiers());
    }

}

step2

转换时都是将一个VO的list转成PO的list,所以以下的方法就是为了达到这种效果

public class CustomerExcelUtils {

    public static <E, T> List<E> createImportList(List<T> excelList, E param) throws Exception {
        Class<?> clazz = param.getClass();
        List<E> importList = excelList.stream()
                .map(item -> {
                    E managePO = null;
                    try {
                        managePO = (E) CustomerConvert.convert(item, clazz);
                    } catch (Exception e) {
                        throw new RuntimeException(e);
                    }

                    isValidItem(managePO);
                    return managePO;
                })
                .collect(Collectors.toList());
        return importList;
    }

    private static <E> void isValidItem(E managePO) {
        if(Objects.isNull(managePO)) {
            throw new RuntimeException("参数异常");
        }
    }
}

使用

	@PostMapping("/importColor")
    @ApiOperation("导入")
    public ResponseInfo<Boolean> importColor(@RequestParam MultipartFile file) throws Exception {
        ImportParams params = ImportExcelUtils.createImportParams(0, 1);

        InputStream is = file.getInputStream();
        List<ColorLcationListExportVO> excelList = ExcelImportUtil.importExcel(is, ColorLcationListExportVO.class, params);

        //优化,createImportList()
        List<ColourLocationListPO> importList = CustomerExcelUtils.createImportList(excelList,new ColourLocationListPO());

        boolean flag = colourLocationListService.saveOrUpdateBatch(importList);

        return ResponseInfo.<Boolean>success().data(flag);
    }

你可能感兴趣的:(反射,泛型,java)