是否有一种简单的方法可以使用 JSR-303 注释在上下文启动时验证 Spring bean?我继承了一些将配置表示为 JSR-303 注释 POJO 的类。这些都是围绕对象层次结构传递的,所以我有点坚持使用它们。
我可以想象定义 bean 设置此类的属性,然后在上下文启动时运行 JSR-303 验证器,以确保正确设置所有值。
请注意,我不是在询问 Spring MVC 中绑定表单提交的验证。
是否有一种简单的方法可以使用 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()
请记住,我没有这样做的经验。但在我看来,这可能是接近实现所需目标的一种方式。