#spring-batch #spring-validator
#весенний пакетный #spring-валидатор
Вопрос:
Я использую ItemListenerSupport для регистрации ошибок в базе данных как часть пакетного задания Spring. Я проверяю записи по мере их обработки с помощью ValidatingItemProcessor, который реализует org.springframework.validation.Validator
.
Проблема в том, что если элемент не проходит проверку, я не уверен, как получить ошибки проверки в ItemListener для ведения журнала. afterProcess
Метод вызывается из ItemProcessListener
и не имеет возможности получить исключение. Возможно ли это?
public SimpleStepBuilder<MyItem, MyItem> simpleStepBuilder(StepBuilderFactory stepBuilderFactory,
ItemProcessor validatingItemProcessor, ItemWriter itemWriter,
MyItemErrorItemListener MyItemErrorItemListenerSupport,
MyItemSkipListener MyItemSkipListener) {
return stepBuilderFactory.get(JOB_NAME).<MyItem, MyItem>chunk(chunkSize)
.processor(validatingItemProcessor) // Calls afterProcess(MyItem src, MyItem result) with result being null
.listener((ItemProcessListener) MyItemErrorItemListenerSupport)
.writer(itemWriter)
.listener((ItemWriteListener) MyItemErrorItemListenerSupport);
}
и пример валидатора:
public class MyItemValidator implements Validator {
@Override
public void validate(@NotNull Object target, Errors errors) {
MyItem myItem = (MyItem) target;
validate(target, errors);
if (CollectionUtils.isNotEmpty(errors.getAllErrors())) {
log.error("Validation Errors: [{}]", errors.getAllErrors());
}
}
}
Я мог бы создать исключение в валидаторе, если появляются ошибки, но это убивает задание
Ответ №1:
Вы должны создать ValidationException
и объявить его как исключение, которое можно пропустить на вашем шаге. При этом вы должны иметь возможность перехватывать недопустимые элементы с SkipListener#skipInProcess
помощью .
Если вы используете SpringValidator
в качестве делегата в ValidatingItemProcessor
, он выдаст ValidationException
этот перенос BindException
, который дает вам доступ ко всем ошибкам проверки для недопустимого элемента.