需求
最近遇到的一个需求,将前端传入的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);
}