是否有一种直接的方法可以使用JSR-303注释在上下文启动时验证
我可以想象定义bean设置这样一个类的属性,然后在上下文启动时运行JSR-303验证器,以确保正确设置所有值。
请注意,我不询问有关Spring MVC中绑定表单提交的验证。
答案 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)
:
validatorFactoryBean.getValidator()
请记住,我没有这样做的经验。但在我看来,这可能是接近实现你所需要的一种方式。