java CSV文件登录数据(返回错误数据)

2021-05-30  本文已影响0人  猫的树

页面上传一个csv文件,check文件内容,如果不满足要求,则返回错误信息,反之则登录数据。(仅供参考)

1.导入依赖(opencsv.jar)
2.创建工具类

UserErrorInfo.java(存放错误信息)

public class UserErrorInfo {
    /**
     * 行番号
     */
     private int rowIndex;
     
    /**
     * 用户ID
     */
    private String userId;
    
    /**
     * 用户名
     */
    private String userName;
    
    /**
     * 错误信息
     */
    private List<String> errMsgs;
    ...
    getter() setter()...
}

CsvUesrRegisInfo.java(数据check)
validation check(可以自定义标签)

public class CsvUesrRegisInfo{
    /**
     * 用户ID
     */
     @NotEmpty()
    private String userId;
    
    /**
     * 用户名
     */
     @NotEmpty()
    private String userName;
    ...
    getter() setter()...
}

CsvUploadOutputDto.java

public class CsvUploadOutputDto{
    /**
     * 用户信息
     */
    private List<?> dataList;
    
    /**
     * check结果
     */
    private BindingResult bindingResult ;
    
    /**
     * check结果
     */
    private List<UserErrorInfo> UserErrorInfoList;
    ...
    getter() setter()...
}

CsvUploadHelper.java
(核心处理)

public class CsvUploadHelper{
    public <T> CsvUploadOutputDto uploadFile(MultipartFile uploadFile, Class<T> csvBeanClass, String bindingResultObjectName){
        CsvUploadOutputDto outputDto = new CsvUploadOutputDto();
        BeanPropertyBindingResult bindingResult = new BeanPropertyBindingResult(uploadFile, bindingResultObjectName);
        // CSV非空check()
        if (uploadFile.isEmpty()) {
            ...// throw new BusinessException(messages);
        }
        List<T> dataList = new ArrayList<>();
        List<ObjectError> errorList = new ArrayList<>();
        List<UserErrorInfo > UserErrorInfos = new ArrayList<>();
        boolean overSizeFlag = false;
        try {
            //读取csv文件
            CSVReader csvReader = new CSVReader(new InputStreamReader(uploadFile.getInputStream(),"MS932"));
            List<String[]> csvLines = csvReader.readAll();
            int lineNumber = 0;
            // 最大行数
            if (maxRecord < csvLines.size()) {
                overSizeFlag = true;
            } else {
                for (String[] line : csvLines) {
                    lineNumber = lineNumber + 1;
                    Class<?> clazz = Class.forName(csvBeanClass.getName);
                    T csvObject = (T) clazz.newInstance;
                    Field fields = csvObject.getClass.getDeclaredFields();
                    BeanPropertyBindingResult result= new BeanPropertyBindingResult(csvObject, csvBeanClass.getName());
                    // check
                    smartValidator.validate(csvObject, result);
                    boolean hasErrorFlag = false;
                    //
                    if (result.hasErrors){
                        hasErrorFlag = true;
                        /**
                         * errMsgList.add(message)
                         * userErrorInfo.setErrMsgs(errMsgList);
                         * userErrorInfos.add(userErrorInfo);
                         */
                    }
                    if (hasErrorFlag ) {
                        errorList.add(objectError)
                    } else {
                        // check通过
                        dataList.add(csvObject);
                    }
                }
            }
            csvReader.close();
        }catch(...){
            ...
        }catch(...){
            ...
        }
        outputDto.setUserErrorInfoList(userErrorInfos);
        outputDto.setDataList(dataList);
        for(objectError error : errorList){
            bindingResult.addError(error);
        }
        outputDto.setBindingResult (bindingResult);
        retrun outputDto;
    }
}

3.调用工具类
controller

outputDto = csvUploadHelper.uploadFile(uploadFile,CsvUesrRegisInfo.class,result.getObjctName());
if (outputDto.getBindingResult().hasError()) {
    //返回错误数据,返回页面
} else{
    //登录数据
}

总结

写这个主要目的是记录,还有很多没在这个上面写出来,但总体就是基本的csv读取和Java反射原理。

上一篇下一篇

猜你喜欢

热点阅读