Issue
I have the following Pojo classes:
public class Student {
String name;
Integer age;
List<Interest> interests;
}
public class Interest {
String name;
Date createdAt;
}
I have the following CSV file with the header in place:
NAME,AGE,INTEREST_1,INTEREST_2,INTEREST_3,INTERESTS_ADDITIONAL
Is it possible to have a FlatFileItemWriter that would write into the csv file based on that header?
The first 3 interests in the list of interests of each student will go into the 3rd, 4th and 5th columns and if there are more than 3 in the list just add their names into the 6th column.
Up until now I always used a FlatFileItemWriter similar to this:
public FlatFileItemWriter<Student> writer() {
FlatFileItemWriter<Student> writer = new FlatFileItemWriter<>();
writer.setResource(outputResource);
writer.setAppendAllowed(true);
writer.setLineAggregator(new DelimitedLineAggregator<Student>() {
{
setDelimiter(",");
setFieldExtractor(new BeanWrapperFieldExtractor<Student>() {
{
setNames(new String[] { "name", "age", "interest" });
}
});
}
});
return writer;
}
But this won't work for list of interest. Any help would be greatly appreciated.
Thank you.
Solution
You can write a custom FieldExtactor
to extract fields as needed. Here is a quick example:
@Bean
public FlatFileItemWriter<Student> itemWriter() {
FlatFileItemWriter<Student> writer = new FlatFileItemWriter<>();
writer.setResource(outputResource);
writer.setAppendAllowed(true);
writer.setLineAggregator(new DelimitedLineAggregator<Student>() {
{
setDelimiter(",");
setFieldExtractor(new FieldExtractor<Student>() {
@Override
public Object[] extract(Student student) {
List<Object> fields = new ArrayList<>();
fields.add(student.getName());
fields.add(student.getAge());
// add interests as needed to the list
return fields.toArray();
}
});
}
});
return writer;
}
Answered By - Mahmoud Ben Hassine