Springboot批处理Tasklet验证

时间:2018-09-10 19:40:02

标签: java spring-boot spring-batch spring-validator

我正在使用带有opencsv的spring batch tasklet处理一些csv文件。在第1步中将文件读入内存后,在第2步中,我希望执行一些验证。我不确定设置验证的正确方法是什么。我正在使用以下代码。

public class PrimaryCareValidation  implements Tasklet, StepExecutionListener {

    private final Logger logger = LoggerFactory.getLogger(PrimaryCareProcessor.class);

    private List<PrimaryCareDTO> batch;

    @Autowired
    private Validator validator;

    @Override
    public void beforeStep(StepExecution stepExecution) {
        logger.info("PrimaryCare validation initialized.");

        ExecutionContext executionContext = stepExecution
                .getJobExecution()
                .getExecutionContext();
        this.batch = (List<PrimaryCareDTO>) executionContext.get("PrimaryCareDTO");
    }

    @Override
    public ExitStatus afterStep(StepExecution stepExecution) {
        logger.info("PrimaryCare validation ended.");
        return ExitStatus.COMPLETED;    }

    @Override
    public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
        logger.info("PrimaryCare execute.");

        for (PrimaryCareDTO pcDTO : batch) {
            DataBinder binder = new DataBinder(pcDTO); 

            Set<ConstraintViolation<PrimaryCareDTO>> violations = validator.validate(pcDTO);

            for (ConstraintViolation<PrimaryCareDTO> violation : violations)
            {
                String propertyPath = violation.getPropertyPath().toString();
                String message = violation.getMessage();

                result.addError(new FieldError("employee",propertyPath,

                        "Invalid "+ propertyPath + "(" + message + ")"));
            }

        }

        return RepeatStatus.FINISHED;    }
}

验证整个DAO列表并将消息添加到消息对象以便稍后返回到步骤3的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

我有非常相似的情况,并用于此vavr库。 它包含有用的Validation对象,该对象可以包含成功的值(在您的情况下为DTO,在失败的情况下)或某些消息。 然后,有一些内置方法可以帮助您将它们压入一个聚合的Validation中。

也请注意@Mahmoud在评论中指出的内容。在这种情况下,最好使用读写器处理器,这样会占用较小的内存空间并且可以扩展。
现在,您有一个大文件的风险,该文件无法容纳在应用程序的内存中。

Same与您的DTO对象有关。它们将保留在内存中,除非tasklet退出。可能会有OutOfMemoryException

请查看这篇文章:https://www.baeldung.com/vavr-validation-api