要实现一个通用的上传方法支持不同类的数据导入,可结合泛型、反射机制和模板设计,具体实现方案如下:
一、通用方法设计
-
泛型定义方法
使用泛型参数约束上传方法,使其能接受不同实体类的类型参数1。javaCopy Code public <T> List<T> uploadData(MultipartFile file, Class<T> clazz) { // 解析逻辑 } -
反射机制动态映射
通过反射获取目标类的字段信息,实现Excel列与类属性的自动匹配2。javaCopy Code Field[] fields = clazz.getDeclaredFields(); -
统一校验接口
定义校验接口,不同类实现自定义校验规则:javaCopy Code public interface DataValidator<T> { void validate(T entity) throws ValidationException; }
二、模板管理
-
动态生成模板
根据目标类字段生成Excel模板,用户下载后按规范填写35。javaCopy Code // 生成表头 headers.addAll(Arrays.stream(fields).map(Field::getName).collect(Collectors.toList())); -
模板版本控制
记录模板版本号,避免用户使用过期的模板格式4。
三、文件解析与校验
-
Apache POI解析文件
使用POI库读取Excel数据,转换为对象列表2:javaCopy Code Workbook workbook = WorkbookFactory.create(file.getInputStream()); Sheet sheet = workbook.getSheetAt(0); -
动态数据转换
反射创建对象实例并填充字段值:javaCopy Code T instance = clazz.newInstance(); field.set(instance, cellValue); -
分层校验机制
- 格式校验:检查空值、数据类型等基础规则3。
- 业务校验:调用自定义校验接口检查业务逻辑(如唯一性、关联关系)4。
四、结果处理
-
分批次导入
对大规模数据分批次处理,避免内存溢出3。 -
错误反馈机制
生成错误报告文件,包含失败原因及行号,供用户下载修正4。 -
结果返回格式
javaCopy Code public class ImportResult<T> { private int successCount; private int errorCount; private List<ErrorDetail> errorDetails; }
五、示例调用
javaCopy Code
// 导入用户数据
List<User> users = uploadService.uploadData(file, User.class, new UserValidator());
// 导入订单数据
List<Order> orders = uploadService.uploadData(file, Order.class, new OrderValidator());
六、关键技术点
- 泛型与反射:实现方法对任意类的兼容性12。
- 动态模板生成:通过类字段信息自动生成模板列45。
- 校验策略分离:格式校验与业务校验解耦,提高扩展性34。
此方案通过泛型、反射和分层校验机制,实现了对不同类的数据导入支持,同时确保代码复用性和可维护性23。