i am trying to read a csv file using @CsvBindAndSplitByPosition annotation with java spring mvc,but there is a problem in parsing my dates list.
this is my object:
import com.opencsv.bean.*;
import java.util.Date;
import java.util.List;
import java.util.SortedSet;
public class UserBindAndSplitByPosition {
@CsvBindByPosition(position = 0)
private String Name;
@CsvBindByPosition(position = 1)
private String Email;
@CsvBindByPosition(position = 2)
private String Address;
@CsvBindAndSplitByPosition(position = 3, elementType = String.class)
private List<String> PhoneNumbers;
@CsvBindAndSplitByPosition(position = 4, elementType = Date.class, splitOn = ";+")
@CsvDate(value="yyyy-MM-dd")
SortedSet<Date> Dates;
public List<String> getPhoneNumbers() {
return PhoneNumbers;
}
public void setPhoneNumbers(List<String> phoneNumbers) {
PhoneNumbers = phoneNumbers;
}
public SortedSet<Date> getDates() {
return Dates;
}
public void setDates(SortedSet<Date> dates) {
Dates = dates;
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
public String getEmail() {
return Email;
}
public void setEmail(String email) {
Email = email;
}
public String getAddress() {
return Address;
}
public void setAddress(String address) {
Address = address;
}
}
the implementation for my service:
import com.csvRead.Repositories.UserBindAndSplitByName;
import com.csvRead.Repositories.UserBindAndSplitByPosition;
import com.opencsv.bean.CsvToBeanBuilder;
import org.springframework.stereotype.Service;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.List;
@Service("CsvBindAndSplitByPosition")
public class CsvBindAndSplitByPosition implements ReadWithAnnotation {
@Override
public void read(File file) {
try {
List<UserBindAndSplitByPosition> list = new CsvToBeanBuilder(new FileReader(file))
.withType(UserBindAndSplitByPosition.class)
.build().parse();
System.out.println(list);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
and i call this service in the the controller.
this is the csv file that i want to read:
User Name,User Email,Address,Phone Numbers,Dates
liena yasir omer,email@gmail.com,oumdurman,0912792888 1111111111 5555555555,2020-03-10T12:39:51.676
huda yasir omer,email@gmail,oman,1111111111 2222222222 1234567890,2020-03-10T12:39:51.676;;;2020-03-10T12:39:51.676
and the error as below:
Exception in thread "pool-1-thread-1" java.lang.RuntimeException: com.opencsv.exceptions.CsvDataTypeMismatchException
at com.opencsv.bean.concurrent.ProcessCsvLine.run(ProcessCsvLine.java:99)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:830)
Caused by: com.opencsv.exceptions.CsvDataTypeMismatchException
at com.opencsv.bean.ConverterDate.convertToRead(ConverterDate.java:299)
at com.opencsv.bean.BeanFieldSplit.convert(BeanFieldSplit.java:189)
at com.opencsv.bean.AbstractBeanField.setFieldValue(AbstractBeanField.java:180)
at com.opencsv.bean.AbstractMappingStrategy.setFieldValue(AbstractMappingStrategy.java:581)
at com.opencsv.bean.AbstractMappingStrategy.populateNewBean(AbstractMappingStrategy.java:328)
at com.opencsv.bean.concurrent.ProcessCsvLine.processLine(ProcessCsvLine.java:128)
at com.opencsv.bean.concurrent.ProcessCsvLine.run(ProcessCsvLine.java:83)
... 3 more
Caused by: java.text.ParseException: Unparseable date: "Dates"
at java.base/java.text.DateFormat.parse(DateFormat.java:395)
at com.opencsv.bean.ConverterDate.convertToRead(ConverterDate.java:286)
... 9 more
Mar 29, 2020 11:02:22 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [dispatcher] in context with path [] threw exception [Request processing failed; nested exception is java.lang.RuntimeException: Error parsing CSV line: 1. [User Name,User Email,Address,Phone Numbers,Dates]] with root cause
java.text.ParseException: Unparseable date: "Dates"
at java.base/java.text.DateFormat.parse(DateFormat.java:395)
at com.opencsv.bean.ConverterDate.convertToRead(ConverterDate.java:286)
at com.opencsv.bean.BeanFieldSplit.convert(BeanFieldSplit.java:189)
at com.opencsv.bean.AbstractBeanField.setFieldValue(AbstractBeanField.java:180)
at com.opencsv.bean.AbstractMappingStrategy.setFieldValue(AbstractMappingStrategy.java:581)
at com.opencsv.bean.AbstractMappingStrategy.populateNewBean(AbstractMappingStrategy.java:328)
at com.opencsv.bean.concurrent.ProcessCsvLine.processLine(ProcessCsvLine.java:128)
at com.opencsv.bean.concurrent.ProcessCsvLine.run(ProcessCsvLine.java:83)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:830)
This is because you are not skipping the first line of your csv, which is the header line.
Change your code to this to skip the first line (note: .withSkipLines)
List<UserBindAndSplitByPosition> list = new CsvToBeanBuilder(new FileReader(file))
.withType(UserBindAndSplitByPosition.class)
.withSkipLines(1)
.build().parse();
System.out.println(list);