繁体   English   中英

关于Spring Bean属性的JSR-303注释

[英]JSR-303 Annotation on Spring Bean Properties

有没有一种直接的方法可以使用JSR-303注释在上下文启动时验证Spring bean? 我继承了一些代表配置为JSR-303注释的POJO的类。 这些都是在对象层次结构中传递的,所以我有点不习惯使用它们。

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

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

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

@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);
        }
    }
}

但我没有测试过它。

简短的回答是否定的。 尽管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。

请记住,我没有这样做的经验。 但它看起来它可以是一种接近实现你需要的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM