SpringBatch - Get row number on FieldSetMapper

I need to get the line number in the FieldSet Mapper. How can i do this?

I want to use lineNumber as the field of my resulting object created by Mapper.

<beans:bean id="fileReader" class="org.springframework.batch.item.file.FlatFileItemReader" scope="step"> <beans:property name="resource" value="file:${batch.source}"/> <beans:property name="lineMapper"> <beans:bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper"> <beans:property name="lineTokenizer"> <beans:bean class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer"> <beans:property name="delimiter" value="${batch.delimiter}"/> <beans:property name="names" value="${batch.columns}"/> </beans:bean> </beans:property> <beans:property name="fieldSetMapper"> <beans:bean class="my.batch.mapper.ResourceFieldSetMapper"/> </beans:property> </beans:bean> </beans:property> </beans:bean> 

Thanks.

+1
source share
2 answers

I realized that I can get the lineNumber value in MyObject by overriding DefaultLineMapper using my own LineMapper like this:

 import org.springframework.batch.item.file.FlatFileParseException; import org.springframework.batch.item.file.LineMapper; import org.springframework.batch.item.file.transform.LineTokenizer; import org.springframework.beans.factory.InitializingBean; import org.springframework.util.Assert; import my.model.MyObject; public class MyLineMapper<T> implements LineMapper<MyObject>, InitializingBean { private LineTokenizer tokenizer; private ResourceFieldSetMapper fieldSetMapper; public MyObject mapLine(String line, int lineNumber) throws Exception { try{ MyObject r = fieldSetMapper.mapFieldSet(tokenizer.tokenize(line)); // this is the modification r.setLineNumber(lineNumber); return r; } catch(Exception ex){ throw new FlatFileParseException("Parsing error at line: " + lineNumber + ", input=[" + line + "]", ex, line, lineNumber); } } public void setLineTokenizer(LineTokenizer tokenizer) { this.tokenizer = tokenizer; } public void setFieldSetMapper(ResourceFieldSetMapper fieldSetMapper) { this.fieldSetMapper = fieldSetMapper; } public void afterPropertiesSet() { Assert.notNull(tokenizer, "The LineTokenizer must be set"); Assert.notNull(fieldSetMapper, "The FieldSetMapper must be set"); } } 

Thank you for your help! Hope this works for someone!

Blessings!

+3
source

I think you can use the expression spel # {fileReader.currentItemCount}, but there is an SB ItemCountAware interface for this purpose.

A marker interface indicating that the item should have a counter of items on it. Commonly used in AbstractItemCountingItemStreamItemReader.

0
source

All Articles