【问题标题】:JSR-303 Annotation on Spring Bean PropertiesJSR-303 对 Spring Bean 属性的注解
【发布时间】:2012-07-19 08:01:36
【问题描述】:

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

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

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

【问题讨论】:

  • 发布一些代码以便我们为您提供帮助

标签: java spring bean-validation


【解决方案1】:

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

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

但我没有测试过。

【讨论】:

    【解决方案2】:

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

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

    实现ApplicationContextListener&lt;ContextStartedEvent&gt; 的实例以在应用程序上下文启动并准备就绪时接收事件。另外,允许 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-04-05
      • 2013-11-23
      • 2011-07-24
      • 2012-11-01
      • 2018-08-12
      • 2015-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多