1

是否有一种简单的方法可以使用 JSR-303 注释在上下文启动时验证 Spring bean?我继承了一些将配置表示为 JSR-303 注释 POJO 的类。这些都是围绕对象层次结构传递的,所以我有点坚持使用它们。

我可以想象定义 bean 设置此类的属性,然后在上下文启动时运行 JSR-303 验证器,以确保正确设置所有值。

请注意,我不是在询问 Spring MVC 中绑定表单提交的验证。

4

2 回答 2

2

如果您想在上下文初始化之后进行此验证,您可以执行以下操作:

@Component
public class MyValidator ApplicationListener<ContextRefreshedEvent> {

    @Autowired private ListableBeanFactory bf;
    @Autowired private Validator validator;


    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        for (String name : bf.getBeanDefinitionNames()) {
            Object bean = bf.getBean(name);
            validator.validate(bean);
        }
    }
}

但我没有测试过。

于 2012-07-19T08:28:01.877 回答
1

简短的回答是否定的。尽管最初在 JSR-303 中并未提及,但它通常用于 MVC 数据绑定和验证。我会尝试以下。

由于您有 JSR-303 注释,因此在 Spring 上下文中配置JSR-303 验证器。在这种情况下,它将LocalValidatorFactoryBean引导标准 JSR-303 验证机制。请注意,您仍然需要在您的类路径中提供 JSR-303 的供应商/实现者(例如 Hibernate Validator)。

实现一个实例ApplicationContextListener<ContextStartedEvent>以在应用程序上下文启动并准备好时接收事件。此外,允许 bean 接收以下实例LocalValidatorFactoryBean

public class GenericApplicationValidator implements ApplicationListener<ContextStartedEvent> {

  private ValidatorFactoryBean validatorFactoryBean;

  public void onApplicationEvent(ContextStartedEvent e) {
    // Refer to next step
  }

  public void setValidatorFactoryBean(ValidatorFactoryBean vfb) {
    this.validatorFactoryBean = vfb;
  }
}

在方法中onApplicationEvent(ContextStartedEvent e)

  1. 获取应用程序上下文的实例。
  2. 通过应用程序上下文,找到您需要验证的所有 bean。
  3. 您有权访问validatorFactoryBean.getValidator()
  4. 遍历所有 bean,使用验证器并验证 bean。

请记住,我没有这样做的经验。但在我看来,这可能是接近实现所需目标的一种方式。

于 2012-07-19T08:35:11.797 回答