Spring Batch ValidatingItemProcessor с ItemListener

#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 , который дает вам доступ ко всем ошибкам проверки для недопустимого элемента.