Error while parsing csv files using super-csv


I am trying a sample program using super-csv, and getting the following exception

Exception in thread "main" org.supercsv.exception.SuperCsvReflectionException: unable to find method setJoiningDate(java.util.Date) in class com.example.supercsv.User - check that the corresponding nameMapping element matches the field name in the bean, and the cell processor returns a type compatible with the field
context=null
	at org.supercsv.util.ReflectionUtils.findSetter(ReflectionUtils.java:185)
	at org.supercsv.util.MethodCache.getSetMethod(MethodCache.java:96)
	at org.supercsv.io.CsvBeanReader.populateBean(CsvBeanReader.java:154)
	at org.supercsv.io.CsvBeanReader.readIntoBean(CsvBeanReader.java:264)
	at org.supercsv.io.CsvBeanReader.read(CsvBeanReader.java:190)
	at com.example.supercsv.ParseCsvToPojo.main(ParseCsvToPojo.java:44)

Following is my POJO and parsing logic

POJO

package com.example.supercsv;

public class User {
    
    long id;
    String name;
    int age;
    String email;
    boolean married;
    String joiningDate;
    
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public boolean isMarried() {
        return married;
    }
    public void setMarried(boolean married) {
        this.married = married;
    }
    public String getJoiningDate() {
        return joiningDate;
    }
    public void setJoiningDate(String joiningDate) {
        this.joiningDate = joiningDate;
    }

}

Parsing Logic

package com.example.supercsv;

import java.io.FileReader;

import org.supercsv.cellprocessor.Optional;
import org.supercsv.cellprocessor.ParseBool;
import org.supercsv.cellprocessor.ParseDate;
import org.supercsv.cellprocessor.ParseInt;
import org.supercsv.cellprocessor.ParseLong;
import org.supercsv.cellprocessor.constraint.NotNull;
import org.supercsv.cellprocessor.ift.CellProcessor;
import org.supercsv.io.CsvBeanReader;
import org.supercsv.io.ICsvBeanReader;
import org.supercsv.prefs.CsvPreference;

public class ParseCsvToPojo {

    private static CellProcessor[] getProcessors() {

        final CellProcessor[] processors = new CellProcessor[] { 
                new NotNull(new ParseLong()), // id
                new NotNull(), // name
                new NotNull(new ParseInt()), // age
                new NotNull(), // email
                new Optional(new ParseBool("Y", "N")), // married
                new ParseDate("yyyy-MM-dd") // joiningDate
        };

        return processors;
    }

    public static void main(String[] args) throws Exception {
        final String CSV_FILENAME = "/experimental/users.csv";
        
        ICsvBeanReader beanReader = null;
        try {
                beanReader = new CsvBeanReader(new FileReader(CSV_FILENAME), CsvPreference.STANDARD_PREFERENCE);
                
                final String[] header = beanReader.getHeader(true);
                final CellProcessor[] processors = getProcessors();
                
                User user;
                while( (user = beanReader.read(User.class, header, processors)) != null ) {
                        System.out.println(String.format("lineNo=%s, rowNo=%s, customer=%s", beanReader.getLineNumber(),
                                beanReader.getRowNumber(), user));
                }
                
        }
        finally {
                if( beanReader != null ) {
                        beanReader.close();
                }
        }
        
    }
}

1 Answer

5 years ago by

You are using ParseDate CellProcessor which will try to set a date on your pojo, but your pojo has a String instead a date field.

Change the joiningDate from String to Date


-    String joiningDate;

-     public String getJoiningDate() {
-         return joiningDate;
-    }
-    public void setJoiningDate(String joiningDate) {
-        this.joiningDate = joiningDate;
-    }

+    Date joiningDate;

+    public Date getJoiningDate() {
+        return joiningDate;
+    }

+    public void setJoiningDate(Date joiningDate) {
+        this.joiningDate = joiningDate;
+    }


5 years ago by Karthik Divi