我正在尝试在 Spring Boot 项目中使用 OpenCSV 依赖项读取 csv 文件。通过邮递员上传我的测试文件时出现以下错误
java.lang.NoSuchMethodError: org.apache.commons.lang3.reflect.FieldUtils.getAllFields(Ljava/lang/Class;)[Ljava/lang/reflect/Field; 在 com.opencsv.bean.util.OpencsvUtils.defineMappingStrategy(OpencsvUtils.java:67) ~[opencsv-5.7.1.jar:na] 在 com.opencsv.bean.CsvToBeanBuilder.build(CsvToBeanBuilder.java:234) ~[opencsv-5.7.1.jar:na] 在 com.personal.sahil.demo.processor.impl.CsvFileProcessor.readFile(CsvFileProcessor.java:32) 〜[班级/:na]在 com.personal.sahil.demo.service.impl.FileServiceImpl.uploadFile(FileServiceImpl.java:44) 〜[班级/:na]在 com.personal.sahil.demo.controller.FileController.pojoUpload(FileController.java:43) 〜[课程/:na]
参考:https://medium.com/@jha.minakshi892/parse-csv-file-to-java-model-c8d2c6727d09
详情
pom 文件
<dependency>
<groupId>com.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>5.7.1</version>
</dependency>
代码库
public <T> List<T> readFile(Class<T> clazz, MultipartFile file) throws IOException {
List<T> records = null;
try (
InputStream inputStream = file.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
Reader reader = new BufferedReader(inputStreamReader)
) {
CsvToBean<?> csvToBean = new CsvToBeanBuilder(reader)
.withType(clazz)
.withIgnoreLeadingWhiteSpace(true)
.withIgnoreEmptyLine(true)
.build();
records = (List<T>) csvToBean.parse();
} catch (Exception ex) {
log.error("error parsing csv file {} ", ex);
throw new IllegalArgumentException(ex.getCause().getMessage());
}
return records;
}
添加更多信息 也低于警告。因此,尝试在方法名称上方使用 @SuppressWarnings("rawtypes") 。但没有解决办法。 未经检查地调用“withType(Class)”作为原始类型“com.opencsv.bean.CsvToBeanBuilder”的成员
**对我来说效果很好的解决方案如下 ** pom 文件
<dependency>
<groupId>com.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>4.0</version>
</dependency>
代码
try (Reader reader = new BufferedReader(new InputStreamReader(file.getInputStream()));
CSVReader csvReader = new CSVReader(reader)) {
String[] nextRecord;
while ((nextRecord = csvReader.readNext()) != null) {
System.out.println("Name : " + nextRecord[0]);
System.out.println("Email : " + nextRecord[1]);
System.out.println("Phone : " + nextRecord[2]);
System.out.println("==========================");
}
}
得到解决方案和问题
我正在使用 org.apache.commons,commons-lang3 依赖项明确版本 3.0
在检查代码的损坏位置时,我意识到版本问题 https://github.com/cygri/opencsv/blob/master/src/main/java/com/opencsv/bean/HeaderColumnNameMappingStrategy.java#L322
用版本 3.12.0 更新了我的 pom,现在工作正常了