【发布时间】:2022-09-30 00:14:31
【问题描述】:
我正在开发一个使用spring boot作为后端和vaadin作为前端的应用程序。我需要添加验证,这需要进行数据库检查 - 是在这个特定示例中注册的电子邮件。
我想要实现的示例:
@Component
public class EmailExistsValidator implements ConstraintValidator<EmailExists, CharSequence> {
private final UserRepo userRepo;
@Autowired
public EmailExistsValidator(UserRepo userRepo) {
this.userRepo = userRepo;
}
@Override
public boolean isValid(CharSequence value, ConstraintValidatorContext context) {
//check email does not exist logic here
}
}
我已经在 spring mvc 和 spring rest 应用程序中成功使用了这个设置,没有额外的配置。不幸的是,上述内容不适用于 vaadin。经过一些调试后,我发现 spring 确实创建并管理了这些组件,但它们不是正在使用的组件。相反,vaadin 在实际验证发生时创建和管理ConstraintValidator 的其他实例。验证通过Binder.writeBeanIfValid() 完成,如果这很重要的话。
我经历了:
- Autowired Repository is Null in Custom Constraint Validator
- Spring Boot: repository does not autowire in the custom validator
- 上面链接的所有问题作为可能的解决方案
- 还有几个问题,很遗憾我找不到了
- 我尝试获取
WebApplicationContext,以便使用AutowireCapableBeanFactory.autowireBean()自动连接带注释的字段。不出所料,当 vaadin 创建/管理实例时,上下文是null,因此它不起作用。我目前正在使用什么。
@Component public class EmailExistsValidator implements ConstraintValidator<EmailExists, CharSequence> { private static UserRepo repo; private final UserRepo userRepo; public EmailExistsValidator() { this.userRepo = repo; } @Bean public static UserRepo setRepo(UserRepo userRepo) { repo = userRepo; return repo; } @Override public boolean isValid(CharSequence value, ConstraintValidatorContext context) { //validation logic } }这种方法基于this answer(来自我链接的第二个问题)。它完成了这项工作(只有这对我有用),但它对我的口味来说太老套了。
如何将 vaadin 配置为使用 spring 管理的
ConstraintValidators,而不是 vaadin 管理的?或者如何在 vaadin 创建和管理的ConstraintValidators 中自动装配弹簧组件?
标签: java spring-boot vaadin vaadin23