由于某些原因,尽管配置了FasterXML Jackson CSV映射器来创建基于POJO的架构,但它坚持认为没有提供合适的配置。我收到以下异常:
com.fasterxml.jackson.databind.JsonMappingException: No value type configured for ObjectReader
com.fasterxml.jackson.databind.ObjectReader._findRootDeserializer(ObjectReader.java:1371)
com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:1265)
com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:897)
aol.model.core.services.admin.CSVParserService.parseCSVFileStreamAsClass(CSVParserService.java:42)
aol.rest.controller.AdminController.importCsvData(AdminController.java:30)
aol.rest.controller.AdminController$$FastClassBySpringCGLIB$$b9304c43.invoke()
org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
...我的POJO非常简单
@JsonPropertyOrder({"firstName", "lastName", "age"})
public class Person {
String firstName;
String lastName;
Integer age;
public Person() {} //no other use than to avoid no-suitable-construction found issue
//getters and setters omitted for brevity
}我的解析代码是
public MappingIterator parseCSVFileStreamAsClass(MultipartFile file) throws IOException {
StringBuilder lines = new StringBuilder();
String lineSeparator = System.getProperty("line.separator");
try(BufferedReader reader = new BufferedReader(new InputStreamReader(file.getInputStream()))) {
for (String r = reader.readLine(); r != null; r = reader.readLine()) {
lines.append(r).append(lineSeparator);
}
}
CsvMapper mapper = new CsvMapper();
CsvSchema schema = mapper
.schemaFor(Person.class)
.withHeader()
.withLineSeparator(lineSeparator);
MappingIterator out = mapper.reader(schema).readValue(lines.toString());
return out;
}我以这种方式处理MultipartFile的原因不是直接读取流,而是消除了文件和映射器之间不匹配行分隔符的问题(我在Windows上工作[不要向下投票给我:(],并且映射器的默认行分隔符只是\n。
数据文件是这样的
firstName,lastName,age
"Paul","Smith","22"
"Jane","Crass","98"
我尝试添加和删除引号(默认字符串分隔符)。我尝试了没有年龄编号的引号,然后加上绝望。没有快乐!
我查看了documentation其他SO问题以及博客文章。没有运气。