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 Eleven
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