1

I am trying to read a java.sql.Date field and parse it to a java bean using Univocity with the following code:

public class Example {

    public static void main(final String[] args) throws FileNotFoundException {
        final BeanListProcessor<Person> rowProcessor = new BeanListProcessor<Person>(Person.class);

        final CsvParserSettings parserSettings = new CsvParserSettings();
        parserSettings.setProcessor(rowProcessor);
        parserSettings.setHeaderExtractionEnabled(false);
        parserSettings.getFormat().setDelimiter('|');       

        final String line = "0|John|12-04-1986";
        final CsvParser parser = new CsvParser(parserSettings);
        parser.parseLine(line);

        final List<Person> beans = rowProcessor.getBeans();

        for (final Person person : beans) {
            // Expected print: Birthday: 12-04-1986
            System.out.println("Birthday: " + person.getBirthDate());
        }       
    }
}

but I am getting the following exception Caused by: java.lang.ClassCastException: java.util.Date cannot be cast to java.lang.String with additional information of com.univocity.parsers.common.DataProcessingException: Error converting value 'Sat Apr 12 00:00:00 CEST 1986' using conversion com.univocity.parsers.conversions.TrimConversion when parsing the line with parser.parseLine(line);

I am trying to represent the Date to how it is in the line e.g. "12-04-1986" and I tried providing the conversion "dd-MM-yyyy", unfortunately to no avail.

What am I missing in my code to get the expected syso of "Birthday: 12-04-1986" ?

EDIT: using java.util.Date

The person class:

// using the correct Date object!
import java.util.Date;

import com.univocity.parsers.annotations.Format;
import com.univocity.parsers.annotations.Parsed;

public class Person {

    @Parsed(index=0)
    private Integer id;

    @Parsed(index=1)
    private String name;

    @Parsed(index=2)
    @Format(formats = "dd-MM-yyyy")
    private Date birthDate;

    //getters and setters ommited
}

When changing the Date object to a java.util.Date and applying the correct date format on the java.util.Date object the print is correctly displaying the expected result.

Sander_M
  • 1,109
  • 2
  • 18
  • 36

1 Answers1

2

The first issue is the conversion sequence you defined:

Conversions.toDate("dd-MM-yyyy"), Conversions.trim()

This generates a Date object, and then applies a String.trim() operation on top of a date instead of a String, which causes the error you just got.

If you change the order this should work:

Conversions.trim(), Conversions.toDate("dd-MM-yyyy")

However, your Person class must have its birthDate field annotated with @Parsed otherwise you'll get a null.

It should be easier to just add the @Format annotation on your birthDate field instead of applying that sequence of conversions. You can just declare your class like this:

public class Person{
    @Parsed
    String id;

    @Parsed
    String name;

    @Parsed
    @Format(formats = "dd-MM-yyyy") //notice that multiple formats are supported
    Date birthDate;
}

Finally, notice that the parser trims values by default so you don't need to use the trim conversion or the @Trim annotation unless you disable trimming in the settings.

Hope this helps.

Jeronimo Backes
  • 6,141
  • 2
  • 25
  • 29
  • `It should be easier to just add the @Format annotation on your birthDate` , is exactly the functionality I was hoping to be present. I couldn't find it in the manual present on github, but this feature makes date parsing alot more easy to use as the actual file being parsed has many date objects and some of them have different formats. Now that I know what to look for I found the `AnotherTestBean.java` example as well. Thanks for the explanation and help! – Sander_M Oct 04 '16 at 08:58