【问题标题】:Implementing Java Bean Validation with annotations in Spring Batch app在 Spring Batch 应用程序中使用注释实现 Java Bean 验证
【发布时间】:2021-03-14 19:49:27
【问题描述】:

我正在尝试在 Spring Batch 应用程序中使用的 Java Bean 上实现 JSR 308 验证注释。 Spring Batch 提供了一个ValidatingItemProcessor,但我想在进入处理器步骤之前进行验证,所以我决定使用 Java 注释。

我认为我可以将注释添加到方法参数,如果该参数没有验证,则永远不会调用该方法。但它不是那样工作的。显然我还是得先打电话给Validator.validate()。我说的对吗?

这是我的 bean 的示例,带有自定义注释:

public void setValue(@NullOrDecimal String value) {
    // I don't want to come into this method if "value" isn't a null or a decimal
    if (StringUtils.isNotEmpty(value)) {
        this.value = new BigDecimal(value);
    }
}

有什么方法可以做我想要在这里实现的目标吗?

【问题讨论】:

    标签: java spring validation spring-batch


    【解决方案1】:

    你是对的。注释本身什么也不做。您应该调用一些代码来内省此注释并执行某些操作(在您的情况下进行验证)。

    数据验证是项目处理器的典型用例,这就是 Spring Batch 提供ValidatingItemProcessor 的原因。如果您想对有效项目进行一些处理(无效项目将被拒绝或过滤,并且不会在链中继续),您始终可以在 CompositeItemProcessor 中链接另一个处理器。

    【讨论】:

    • 实际上,Mahmoud,这是您真正错误的一次。 :-) 我找到了一篇文章,它准确地列出了我的 bean 需要什么样的外观才能完成我想要的!
    • 我可能错了,我对此没有问题。然而,我不这么认为。如果你分享你的完整代码,我可以告诉你在哪里进行验证。
    • 感谢您的示例!我对BeanValidatingItemProcessor 的唯一问题是必须在 bean 中设置字段,然后进行验证。我想要的是在它们进入 bean 之前拦截这些值。
    • 这不是 bean 验证 API 的工作方式。该 API 的想法是使用验证约束来注释类,并在填充的 bean 上调用验证过程(使用有效或无效数据)。在将值设置在字段上之前,我看不到它如何验证值。在这种情况下,谁将调用验证码?
    • 带有参数级验证注释和MethodValidationPostProcessor。我还必须在班级级别使用@Validated 注释我的bean。根据这篇文章,@Validated 自动驱动验证过程,而不是validate() 方法的编程调用。我希望这是有道理的?如果没有,我将创建我的代码的要点。
    【解决方案2】:

    我发现this article 准确描述了如何实现我的解决方案。一旦我将我的 POJO 变成了一个组件(这可能不是必需的),Spring 就开始在设置参数之前拦截我的方法。这就是我想要实现的目标。

    【讨论】:

    • 你的 POJO 不必是一个组件才能工作,这里有一个例子:github.com/spring-projects/spring-batch/blob/…。如果你想对你的项目应用 Bean Validation 约束,你可以使用BeanValidatingItemProcessorValidatingItemProcessor 更通用。
    猜你喜欢
    • 2021-09-03
    • 2018-08-12
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    • 1970-01-01
    • 2015-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多