Я хочу переписать пропущенные строки считывателя в выходном файле отклонения, спасибо.
Мой код:
public class JobPerson {
@Autowired
private JobBuilderFactory jobs;
@Autowired
private StepBuilderFactory steps;
@Bean
public ItemReader<Person> itemReader() {
FlatFileItemReader<Person> reader = new FlatFileItemReader<Person>();
reader.setResource(new ClassPathResource("user.csv"));
reader.setLineMapper(new DefaultLineMapper<Person>() {{
setLineTokenizer(new DelimitedLineTokenizer(";") {{
setNames(new String[] {"firstName", "lastName", "age" });
}});
setFieldSetMapper(new BeanWrapperFieldSetMapper<Person>() {{
setTargetType(Person.class);
}});
}});
return reader;
}
@Bean
public ItemWriter<Person> itemWriter() {
return items -> {
int i=0;
for (Person item : items) {
i++;
System.out.println(i+". Nom = " + item.getFirstName()+". Prenom = " + item.getLastName());
}
};
}
@Bean
public ItemProcessor<Person, Person> itemProcessor() {
return item -> {
String stritem=item.toString();
String[] splitArray = stritem.split(";"); // tableau de chaînes
int lineData = splitArray.length;
//if (lineData<2)
if (item.equals("Eric")) {
throw new IllegalArgumentException("Wanted!");
}
return item;
};
}
@Bean
public Step step() {
return steps.get("step")
.<Person, Person>chunk(5)
.reader(itemReader())
.processor(itemProcessor())
.writer(itemWriter())
.faultTolerant()
.skip(IllegalArgumentException.class)
.skipLimit(100)
.listener(new MySkipListener())
.skip(Exception.class)
.build();
}
@Bean
public Job job() {
return jobs.get("job")
.start(step())
.build();
}
public static class MySkipListener implements SkipListener<Person, Person> {
@Override
public void onSkipInRead(Throwable t) {
System.err.println("On Skip in Read Error : " + t.getMessage());
}
@Override
public void onSkipInWrite(Person item, Throwable t) {
System.out.println("Item " + item + " was skipped due to: " + t.getMessage());
}
@Override
public void onSkipInProcess(Person item, Throwable t) {
System.out.println("Item " + item + " was skipped due to: " + t.getMessage());
}
}
}
Строки для перезаписи (строки красного цвета):
=> Пропустить при ошибке чтения: Ошибка разбора в строке: 2 в ресурсе = [ресурс пути к классу [user.csv]], вход = [Эрик; Боннетон;] Пропустить при ошибке чтения: Ошибка разбора в строке: 3 в ресурсе = [ресурс пути к классу [user.csv]], input = [sdqsdqs;]