Я пытаюсь перехватить элементы, которые не удалось вставить в базу данных из-за нарушения уникального ключа. После «повсеместного» исследования это обескураживающе начинает ощущаться как нефиксированная ошибка или что-то в этом роде. Честно говоря, мне нужно полезное разъяснение.
Редактировать: Посетил здесь , чтобы пропустить исключения, захваченные с помощью @OnSkipInWrite
, и это либо недостаточно ясно, либо просто не будет работать.
@Bean
public PersonFailureLoggerListener loggerListener() {
return new PersonFailureLoggerListener();
}
@Bean
public Step step1(JdbcBatchItemWriter<Person> writer) throws MalformedURLException {
return stepBuilderFactory.get("step1")
.<Person, Person>chunk(10)
.reader(reader())
.faultTolerant().skipPolicy(fileVerificationSkipper())
.processor(itemProcessor())
.writer(writer)
//.listener(new PersonWriteListener())
.listener(loggerListener().asItemProcessListener())
.build();
}
Поддержка слушателя элемента:
@Component
public class PersonFailureLoggerListener extends ItemListenerSupport<Person, Person> {
private static final Logger LOG = LoggerFactory.getLogger(Person.class.getSimpleName().concat(".error"));
@Override
public void afterProcess(Person i, Person o) {
LOG.info("before: {}, after: {}", i.toString(), o.toString());
}
@Override
public void onWriteError(Exception excptn, List<? extends Person> list) {
LOG.debug("list[{}] threw write exception", list.size(), excptn);
}
@Override
public void onReadError(Exception excptn) {
LOG.debug("encountered error on read", excptn);
}
public ItemProcessListener<Person, Person> asItemProcessListener() {
return this;
}
}
Обновление PersonFailureLoggerListener
:
@OnSkipInWrite
public void onSkipInWrite( Person skippedItem, Exception exception ){
LOG.debug("skipped person: {}", skippedItem.toString());
}