我需要将行号放入FieldSet Mapper中。我怎么能这样做?
我想将lineNumber用作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>
谢谢。
答案 0 :(得分:4)
我意识到我可以通过使用我自己的 LineMapper 覆盖 DefaultLineMapper ,将 lineNumber 值转换为 MyObject 这样:
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");
}
}
感谢您的帮助!我希望这对某人有用!
祝福!
答案 1 :(得分:0)
我认为您可以使用spEL表达式#{fileReader.currentItemCount},但为此目的有SB接口ItemCountAware。
标记界面,指示项目应具有项目计数 设置它。通常用于 AbstractItemCountingItemStreamItemReader。