2015-01-12 8 views
2

Я пытаюсь прочитать простой CSV-файл, используя Jackson CsvParser. Я следовал учебник, но я получаю следующее сообщение об ошибке: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: [email protected]; line: 2, column: 1] 
at com.fasterxml.jackson.databind.MappingIterator.next(MappingIterator.java:121) 

Файл MYFILE.CSV 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 + "]"; 
     } 
    } 
} 

ответ

3

С кодом нет в Вашей системе 3 следующих вопросов:

1) Вам нужно передать свойства которые будут читать схемы CSV, в вашем случае это address1 и address2:

CsvSchema schema = CsvSchema.builder() 
          .addColumn("address1") 
          .addColumn("address2") 
          .build(); 

2) Ваш внутренний класс не помечен как статический, проверьте this link, что объясняет, почему это необходимо.

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 + "]"; 
     } 
    } 
} 
+0

Спасибо! Это сделал трюк. Номер 1), хотя и не был необходим, если заголовки файлов соответствуют свойствам POJO, он работает с моим исходным CsvSchema.emptySchema(). WithHeader(). – Gep

Смежные вопросы