【问题标题】:Get bean validation message from spring batch从 Spring Batch 获取 bean 验证消息
【发布时间】:2020-05-26 03:52:08
【问题描述】:

我正在使用文档中定义的 Spring Batch 和 beanValidationItemProcessor()。

@Bean
@StepScope
public BeanValidatingItemProcessor<VendorDTO> beanValidatingItemProcessor() throws Exception {
    BeanValidatingItemProcessor<VendorDTO> beanValidatingItemProcessor = new BeanValidatingItemProcessor<>();
    beanValidatingItemProcessor.setFilter(false);

    return beanValidatingItemProcessor;
}

当验证发生时,org.springframework.batch.item.validator.ValidationException 被抛出,我可以看到我的字段错误。

字段 'peid' 上的对象 'item' 中的字段错误:拒绝值 [];代码 [大小.item.peid,大小.peid,大小.java.lang.String,大小];论据 [org.springframework.context.support.DefaultMessageSourceResolvable: 代码 [item.peid,peid];论据 [];默认消息 [peid],12,1]; 默认消息[大小必须在 1 到 12 之间]

如何获取解析字段 id 和默认消息的简单消息对象?

【问题讨论】:

  • 我不明白这个问题(完全)...哪个id? “解决……”是什么意思?这是否朝着正确的方向发展:baeldung.com/spring-custom-validation-message-source ?
  • @xerx593 对不起,我的意思是字段名。我将在下面发布我自己的问题的答案。如果您有更好的解决方案,请告诉我。我只是想获得一个带有字段名称、拒绝值和默认消息的简单消息对象。

标签: spring spring-batch


【解决方案1】:

我发现我已经能够通过将 ValidationException getCause() 转换为 BindException 来访问字段错误,然后我可以访问字段错误。

@OnSkipInProcess
public void logSkippedEmail(VendorDTO vendorDTO, Throwable t) {
    JobExecution jobExecution = stepExecution.getJobExecution();

    if (t instanceof ValidationException) {
        ValidationException e = (ValidationException) t;

        if(e.getCause() instanceof BindException) {
            BindException bindException = (BindException) e.getCause();

            List<FieldError> fieldErrors = bindException.getFieldErrors();

            for (FieldError fieldError : fieldErrors) {
                BatchValidation batchValidation = new BatchValidation();

                batchValidation.setDataField(fieldError.getField());
                batchValidation.setRejectedValue(String.valueOf(fieldError.getRejectedValue()));
                batchValidation.setValidationMessage(fieldError.getDefaultMessage());
                batchValidation.setJobInstanceId(jobExecution.getJobId());
                batchValidation.setJobName(jobExecution.getJobInstance().getJobName());

                batchValidationRepository.save(batchValidation);
            }
        }

    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-17
    • 2013-04-14
    • 2011-05-11
    • 1970-01-01
    • 2023-03-08
    • 2011-12-24
    • 1970-01-01
    • 2020-02-19
    相关资源
    最近更新 更多