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

时间:2012-07-19 08:01:36

标签: java spring bean-validation

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

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

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

2 个答案:

答案 0 :(得分: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);
        }
    }
}

但我没有测试过它。

答案 1 :(得分:1)

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

由于您有JSR-303注释,因此请配置JSR-303 validator in Spring context。在这种情况下,引导标准JSR-303验证机制的是LocalValidatorFactoryBean。请注意,您仍需要在类路径中提供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。
  5. 请记住,我没有这样做的经验。但在我看来,这可能是接近实现你所需要的一种方式。