在 Spring Batch 应用程序中使用注释实现 Java Bean 验证

Implementing Java Bean Validation with annotations in Spring Batch app

我正在尝试在我的 Java Bean 上实现 JSR 308 验证注释,该 Bean 在 Spring Batch 应用程序中使用。 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);
    }
}

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

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

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

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