2016-07-14 6 views
1

Ich habe versucht, ein verschachteltes POJO mit CSV zu laden. Für einen Fehler konnte ich es nicht funktionieren lassen.Verschachtelte POJO mit Super-CSV lesen

Hier finden Sie meinen Code unten. Die unten Klasse Person enthält zwei POJO Feldadresse und attribs

public class Person 
{ 
    public String   firstname; 
    public String   lastname; 
    public PersonAttribute attribs; 
    public Address   address; 
    //Getters and setters 
} 


PersonAttribute class 

{ 
    public int height; 
    public int weight; 
    //Getters and setters 
} 

Adresse Klasse

public class Address 
{ 
    public String  city; 
    public String  zipCode; 
    public GeoLocation geoLocation; 

// Getter und Setter }

GeoLocation

public class GeoLocation 
{ 
    private String latitude; 
    private String longitude; 

// Getter und Setter }

Und jetzt versuche ich, die CSV zu lesen und Personenklasse zu füllen. Ich kann es nicht funktionieren lassen. Hier ist mein Code

public class ReadWithCsvDozerBeanReader 
{ 

    private static final String  CSV      = "firstname, lastname, height, weight, city,zipcode,latitude,longitude\n" 
     + "bill,smith,180,200,ABC,123,48.8525525,2.3417763\n" + "james,smith,192,250,DEF,456,48.852129,2.3355093"; 

    private static final int   ATT_START_INDEX   = 2; 

    private static final int   ADDRESS_START_INDEX  = 4; 

    private static final int   GEO_LOCATION_START_INDEX = 6; 

    // custom preferences required because CSV contains spaces that aren't part 
    // of the data 
    private static final CsvPreference PREFS     = new CsvPreference.Builder(
      CsvPreference.STANDARD_PREFERENCE).surroundingSpacesNeedQuotes(true).build(); 

    public static void main (String[] args) throws IOException 
    { 
     readWithCsvDozerBeanReader(new StringReader(CSV)); 

    } 

    private static void readWithCsvDozerBeanReader (final Reader reader) throws IOException 
    { 
     ICsvDozerBeanReader beanReader = null; 
     try 
     { 
      beanReader = new CsvDozerBeanReader(reader, PREFS); 

      final String[] header = beanReader.getHeader(true); 

      // set up the field mapping, processors and hints dynamically 
      final String[] fieldMapping = new String[header.length]; 
      final CellProcessor[] processors = new CellProcessor[header.length]; 
      final Class<?>[] hintTypes = new Class<?>[header.length]; 
      for (int i = 0; i < header.length; i++) 
      { 
       if (i < ATT_START_INDEX) 
       { 
        // normal mappings 
        fieldMapping[i] = header[i]; 
        processors[i] = new NotNull(); 
        hintTypes[i] = Person.class; 
       } 
       else if (i < ADDRESS_START_INDEX) 
       { 
        // attribute mappings 
        fieldMapping[i] = header[i]; 
        processors[i] = new NotNull(); 
        hintTypes[i] = PersonAttribute.class; 
       } 
       else if (i < GEO_LOCATION_START_INDEX) 
       { 

        // Address mappings 
        fieldMapping[i] = header[i]; 
        hintTypes[i] = Address.class; 

       } 
       else 
       { 
        fieldMapping[i] = header[i]; 
        hintTypes[i] = GeoLocation.class; 
       } 

      } 

      beanReader.configureBeanMapping(Person.class, fieldMapping, hintTypes); 

      Person person; 
      while ((person = beanReader.read(Person.class, processors)) != null) 
      { 
       System.out.println(String.format("lineNo=%s, rowNo=%s, person=%s", beanReader.getLineNumber(), 
         beanReader.getRowNumber(), person)); 
      } 

     } 
     finally 
     { 
      if (beanReader != null) 
      { 
       beanReader.close(); 
      } 
     } 
    } 

} 

ich die folgenden Fehler Exception in thread „main“ org.dozer.MappingException bekommen: Nein lesen oder Verfahren für das Feld (Höhe) in der Klasse

Antwort

1

habe ich es gefunden schreiben arbeiten. Das Problem lag in der Feldzuordnung.

private static void readWithCsvDozerBeanReader (final Reader reader) throws IOException 
{ 
    ICsvDozerBeanReader beanReader = null; 
    try 
    { 
     beanReader = new CsvDozerBeanReader(reader, PREFS); 

     final String[] header = beanReader.getHeader(true); 

     // set up the field mapping, processors and hints dynamically 
     final String[] fieldMapping = new String[header.length]; 
     final CellProcessor[] processors = new CellProcessor[header.length]; 
     final Class<?>[] hintTypes = new Class<?>[header.length]; 
     for (int i = 0; i < header.length; i++) 
     { 
      fieldMapping[i] = header[i]; 
      if (header[i].equals("firstname")) 
      { 
       processors[i] = new NotNull(); 
      } 
      if (header[i].equals("height") || header[i].equals("weight")) 
      { 
       processors[i] = new ParseInt(); 
      } 
     } 

     beanReader.configureBeanMapping(Person.class, fieldMapping, hintTypes); 

     Person person; 
     while ((person = beanReader.read(Person.class, processors)) != null) 
     { 
      System.out.println(String.format("lineNo=%s, rowNo=%s, person=%s", beanReader.getLineNumber(), 
        beanReader.getRowNumber(), person)); 
     } 

    } 
    finally 
    { 
     if (beanReader != null) 
     { 
      beanReader.close(); 
     } 
    } 
}