[英]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)
的方法中:
validatorFactoryBean.getValidator()
请记住,我没有这样做的经验。 但它看起来它可以是一种接近实现你需要的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.