CsvParser " не найден подходящий конструктор для типа"
Я пытаюсь прочитать простой CSV-файл с помощью Jackson CsvParser. Я следовал учебнику, но постоянно получаю следующую ошибку:
com.fasterxml.jackson.databind.RuntimeJsonMappingException: No suitable constructor found for type [simple type, class data.MyPojo$MyPojo]: can not instantiate from JSON object (missing default constructor or creator, or perhaps need to add/enable type information?)
at [Source: java.io.InputStreamReader@3d362683; line: 2, column: 1]
at com.fasterxml.jackson.databind.MappingIterator.next(MappingIterator.java:121)
Файл CSV MYFILE.CSV очень прост:
FirstAddress,SecondAddress
Blah,Blah
Etc,Etc
И код тоже:
public class MyPojoLookup {
private final static String FILENAME = "/MYFILE.CSV";
private final static CsvMapper mapper = new CsvMapper();
static {
CsvSchema schema = CsvSchema.emptySchema().withHeader();
InputStream input = (MyPojoLookup.class.getResourceAsStream(FILENAME));
MappingIterator<MyPojo> it;
try {
it = mapper.reader(MyPojo.class).with(schema).readValues(input);
while (it.hasNext()){
MyPojo row = it.next();
log.info(row.toString());
}
} catch (Exception e) {
log.error("Cannot load the addresses", e);
System.exit(-1);
}
}
private class MyPojo {
public String address1;
public String address2;
public MyPojo(String address1, String address2) {
super();
this.address1 = address1;
this.address2 = address2;
}
@Override
public String toString() {
return "MyPojo ["address1=" + address1 + ", address2=" + address2 + "]";
}
}
}
1 ответ:
Существует три проблемы с вашим кодом:
1) вам нужно передать свойства, которые будут считываться в схему CSV, в вашем случае это
address1
иaddress2
:CsvSchema schema = CsvSchema.builder() .addColumn("address1") .addColumn("address2") .build();
2) Ваш внутренний класс не помечен как статический, проверьте эту ссылку, которая объясняет, почему это необходимо.
3) отсутствует конструктор по умолчанию.
Вот полный список со всеми примененными исправлениями:
import com.fasterxml.jackson.databind.MappingIterator; import com.fasterxml.jackson.dataformat.csv.CsvMapper; import com.fasterxml.jackson.dataformat.csv.CsvSchema; import java.io.InputStream; public class MyPojoLookup { private final static String FILENAME = "/MYFILE.CSV"; private final static CsvMapper mapper = new CsvMapper(); public static void main(String[] args) { CsvSchema schema = CsvSchema.builder().addColumn("address1").addColumn("address2").build(); InputStream input = (MyPojoLookup.class.getResourceAsStream(FILENAME)); MappingIterator<MyPojo> it; try { it = mapper.reader(MyPojo.class).with(schema).readValues(input); while (it.hasNext()){ MyPojo row = it.next(); System.out.println(row.toString()); } } catch (Exception e) { System.out.println("Cannot load the addresses"); e.printStackTrace(); System.exit(-1); } } private static class MyPojo { public String address1; public String address2; public MyPojo() {} public MyPojo(String address1, String address2) { super(); this.address1 = address1; this.address2 = address2; } @Override public String toString() { return "MyPojo [address1=" + address1 + ", address2=" + address2 + "]"; } } }