2015-01-12 78 views
2

我正在尝试使用Jackson CsvParser读取一个简单的CSV文件。 我跟着教程,但我不断收到以下错误: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) 

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

回答

3

您的代码有三个问题:

1)您需要传递属性那将要读取到CSV模式,你的情况这些都是address1address2

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

相关问题