I am trying to batch process a file which has date field. Now when I fetch Date field using FlatFileItemReader it comes as a String. I am trying to map it to following entity
@Entity
@Data
public class Customers {
@Id
@GeneratedValue
@Column(name = "id")
private Long id;
@Column(name = "customer_name")
private String customer_name;
@Column(name="created_at", nullable=false)
@Temporal(TemporalType.TIMESTAMP)
public Date createdAt;
@PrePersist
protected void onCreate() {
createdAt = new Date();
}
}
My File is having values like "id","customer_name","created_at" 1,Customer1,"2024-07-06 22:51:31" 2,Customer2,"2024-07-06 22:51:31" 3,Customer3,"2024-07-06 22:51:31" 4,Customer4,"2024-07-06 22:51:31" 5,Customer5,"2024-07-06 22:51:31" 6,Customer6,"2024-07-06 22:51:31" 7,Customer7,"2024-07-06 22:51:31" 8,Customer8,"2024-07-06 22:51:31" 9,Customer9,"2024-07-06 22:51:31" 10,Customer10,"2024-07-06 22:51:31"
Here is my reader
@Bean
FlatFileItemReader<Customers> reader(){
FlatFileItemReader<Customers> itemReader = new FlatFileItemReader<>();
itemReader.setResource(new FileSystemResource("src/main/resources/customers.csv"));
itemReader.setName("customerReader");
itemReader.setLinesToSkip(1);
itemReader.setLineMapper(linemapper());
return itemReader;
}
private LineMapper<Customers> linemapper(){
DefaultLineMapper<Customers> lineMapper = new DefaultLineMapper<>();
DelimitedLineTokenizer lineTokenizer = new DelimitedLineTokenizer();
lineTokenizer.setDelimiter(",");
lineTokenizer.setStrict(false);
lineTokenizer.setNames("id","customer_name","createdAt");
BeanWrapperFieldSetMapper<Customers> fieldSetMapper = new BeanWrapperFieldSetMapper<>();
fieldSetMapper.setTargetType(Customers.class);
lineMapper.setLineTokenizer(lineTokenizer);
lineMapper.setFieldSetMapper(fieldSetMapper);
return lineMapper;
}
I am getting following error
org.springframework.batch.item.file.FlatFileParseException: Parsing error at line: 3 in resource=[file [D:\projects\springmvc\connectionpooling\src\main\resources\customers.csv]], input=[1,Customer1,"2024-07-06 22:51:31"]
at org.springframework.batch.item.file.FlatFileItemReader.doRead(FlatFileItemReader.java:198) ~[spring-batch-infrastructure-5.1.2.jar:5.1.2]
at org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader.read(AbstractItemCountingItemStreamItemReader.java:93) ~[spring-batch-infrastructure-5.1.2.jar:5.1.2]
at org.springframework.batch.core.step.item.SimpleChunkProvider.doRead(SimpleChunkProvider.java:108) ~[spring-batch-core-5.1.2.jar:5.1.2]
at org.springframework.batch.core.step.item.SimpleChunkProvider.read(SimpleChunkProvider.java:182) ~[spring-batch-core-5.1.2.jar:5.1.2]
at org.springframework.batch.core.step.item.SimpleChunkProvider.lambda$provide$0(SimpleChunkProvider.java:132) ~[spring-batch-core-5.1.2.jar:5.1.2]
at org.springframework.batch.repeat.support.RepeatTemplate.getNextResult(RepeatTemplate.java:369) ~[spring-batch-infrastructure-5.1.2.jar:5.1.2]
at org.springframework.batch.repeat.support.RepeatTemplate.executeInternal(RepeatTemplate.java:206) ~[spring-batch-infrastructure-5.1.2.jar:5.1.2]
at org.springframework.batch.repeat.support.RepeatTemplate.iterate(RepeatTemplate.java:140) ~[spring-batch-infrastructure-5.1.2.jar:5.1.2]
at org.springframework.batch.core.step.item.SimpleChunkProvider.provide(SimpleChunkProvider.java:127) ~[spring-batch-core-5.1.2.jar:5.1.2]
at org.springframework.batch.core.step.item.ChunkOrientedTasklet.execute(ChunkOrientedTasklet.java:69) ~[spring-batch-core-5.1.2.jar:5.1.2]
at org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:388) ~[spring-batch-core-5.1.2.jar:5.1.2]
at org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:312) ~[spring-batch-core-5.1.2.jar:5.1.2]
at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140) ~[spring-tx-6.1.10.jar:6.1.10]
at org.springframework.batch.core.step.tasklet.TaskletStep$2.doInChunkContext(TaskletStep.java:255) ~[spring-batch-core-5.1.2.jar:5.1.2]
at org.springframework.batch.core.scope.context.StepContextRepeatCallback.doInIteration(StepContextRepeatCallback.java:82) ~[spring-batch-core-5.1.2.jar:5.1.2]
at org.springframework.batch.repeat.support.TaskExecutorRepeatTemplate$ExecutingRunnable.run(TaskExecutorRepeatTemplate.java:261) ~[spring-batch-infrastructure-5.1.2.jar:5.1.2]
at java.base/java.lang.Thread.run(Thread.java:1570) ~[na:na]
Caused by: org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors
Field error in object 'target' on field 'createdAt': rejected value [2024-07-06 22:51:31]; codes [typeMismatch.target.createdAt,typeMismatch.createdAt,typeMismatch.java.util.Date,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [target.createdAt,createdAt]; arguments []; default message [createdAt]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.Date' for property 'createdAt'; Cannot convert value of type 'java.lang.String' to required type 'java.util.Date' for property 'createdAt': no matching editors or conversion strategy found]
at org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper.mapFieldSet(BeanWrapperFieldSetMapper.java:186) ~[spring-batch-infrastructure-5.1.2.jar:5.1.2]
at org.springframework.batch.item.file.mapping.DefaultLineMapper.mapLine(DefaultLineMapper.java:42) ~[spring-batch-infrastructure-5.1.2.jar:5.1.2]
at org.springframework.batch.item.file.FlatFileItemReader.doRead(FlatFileItemReader.java:194) ~[spring-batch-infrastructure-5.1.2.jar:5.1.2]
... 16 common frames omitted
Is there somehow we can typcast one field to Date in FlatFileItemReader before mapping