java - 使用 super-CSV 读取嵌套 POJO

标签 java dozer supercsv

我试图用 CSV 加载嵌套 POJO 。由于某些错误,我无法使其工作。

请在下面找到我的代码。下面的Person类包含两个POJO字段地址和属性

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
}

地址类别

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

// getter 和 setter }

地理位置

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

// getter 和 setter }

现在我正在尝试读取 CSV 并填充 person 类。我无法让它发挥作用。这是我的代码

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();
            }
        }
    }

}

我收到以下错误 线程“main”中的异常org.dozer.MappingException:在类中找不到字段(高度)的读取或写入方法

最佳答案

我让它工作了。问题出在字段映射中。

 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();
        }
    }
}

关于java - 使用 super-CSV 读取嵌套 POJO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38367507/

相关文章:

jpa - org.dozer.MappingException : No read or write method found for field

带有未转义引号的 Java CSV 解析器

java - 官方 supercsv 推土机示例不适用于 Play — Play 2.1.1,Java

java - 如何更改使选项卡式面板每隔几秒自行更改一次?

java - Eclipse Indigo 安装 m2e-wtp 插件时出现问题

java - 从 dozer-mapping.xml 读取 <mappings> 时 SaxParser Eception

java - Dozer,如何将 map 转换为复杂类型列表

java - 如何将 List<String> 写入 csv 文件并使用 supercsv 读回

java - 合并排序返回一个由第一个条目的多个重复项组成的 ArrayList,而不是已排序的 ArrayList

java - 如何使用hadoop mapreduce编程来统计文件中特定单词的出现次数?