gpt4 book ai didi

java - 尽管配置了架构,Jackson CsvMapper 仍无法正确反序列化为 POJO

转载 作者:行者123 更新时间:2023-11-29 08:31:48 25 4
gpt4 key购买 nike

出于某种原因,尽管配置了 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(<generated>)
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<Person> 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<Person> out = mapper.reader(schema).readValue(lines.toString());
return out;
}

我以这种方式处理 MultipartFile 而不是直接读取流的原因是消除了文件和映射器之间行分隔符不匹配的问题(我在 Windows 上工作 [不要对我投反对票 :(],以及映射器的默认行分隔符只有 \n

数据文件是这个

firstName,lastName,age

"Paul","Smith","22"

"Jane","Crass","98"

我尝试添加和删除引号(默认字符串分隔符)。我试过没有年龄数字引号,然后绝望地添加了它们。没有快乐!

我查看了 documentation其他 SO 问题以及博客文章。运气不好。

最佳答案

好的,所以我的同事想通了。

MappingIterator<Person> out = mapper.reader(schema).readValue(lines.toString());

需要改成

MappingIterator<Person> out = mapper.reader(Person.class).with(schema).readValue(lines.toString());

其他的就好了

关于java - 尽管配置了架构,Jackson CsvMapper 仍无法正确反序列化为 POJO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47425923/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com