谢谢你的侦探工作。这肯定是个错误。
据我所见,在夸克中我们没什么可做的。Vaadin Flow应避免存储
ValidatorFactory
在静态场中
LazyFactoryInitializer#FACTORY
。或者至少在应用程序停止时清理一下,然后创建一个新的应用程序。当前的代码会导致类加载器泄漏,任何服务器都会重新加载应用程序。
以下是Ivan Kaliuzhnyi在流量跟踪器中的评论
https://github.com/vaadin/flow/issues/4481#issuecomment-1712720926
,即使它一点都不漂亮,你也应该能够解决它。
粘贴评论以保留历史:
@Configuration
public class ValidatorConfig implements InitializingBean {
@Autowired
private ValidatorFactory validatorFactory;
@Bean
public ValidatorFactory validatorFactory(MessageSource messageSource) {
var bean = new LocalValidatorFactoryBean();
bean.setValidationMessageSource(messageSource);
return bean;
}
@Bean
public HibernatePropertiesCustomizer hibernatePropertiesCustomizer(ValidatorFactory validatorFactory) {
// AvailableSettings.JPA_VALIDATION_FACTORY -> javax.persistence.validation.factory
// AvailableSettings.JAKARTA_VALIDATION_FACTORY -> jakarta.persistence.validation.factory
return hibernateProperties ->
hibernateProperties.put(AvailableSettings.JAKARTA_VALIDATION_FACTORY, validatorFactory);
}
@Override
public void afterPropertiesSet() throws Exception {
var className = "com.vaadin.flow.data.validator.BeanValidator.LazyFactoryInitializer";
var fieldName = "FACTORY";
var field = FieldUtils.getDeclaredField(ClassUtils.getClass(className), fieldName, true);
var unsafeField = Unsafe.class.getDeclaredField("theUnsafe");
unsafeField.setAccessible(true);
var unsafe = (Unsafe) unsafeField.get(null);
unsafe.putObject(unsafe.staticFieldBase(field),
unsafe.staticFieldOffset(field),
validatorFactory);
}
}