lazily load the validator factory and validator for the cdi extension - note: we can surely lazy load the config as well if needed
diff --git a/bval-jsr/src/main/java/org/apache/bval/cdi/BValExtension.java b/bval-jsr/src/main/java/org/apache/bval/cdi/BValExtension.java
index 8aa216f..c564823 100644
--- a/bval-jsr/src/main/java/org/apache/bval/cdi/BValExtension.java
+++ b/bval-jsr/src/main/java/org/apache/bval/cdi/BValExtension.java
@@ -52,6 +52,7 @@
import org.apache.bval.jsr.ConfigurationImpl;
import org.apache.bval.jsr.util.ExecutableTypes;
+import org.apache.bval.util.Lazy;
import org.apache.bval.util.Validate;
/**
@@ -73,8 +74,8 @@
private boolean validatorFactoryFound = Boolean.getBoolean("bval.in-container");
private final Configuration<?> config;
- private ValidatorFactory factory;
- private Validator validator;
+ private Lazy<ValidatorFactory> factory;
+ private Lazy<Validator> validator;
private Set<ExecutableType> globalExecutableTypes;
private boolean isExecutableValidationEnabled;
@@ -106,9 +107,9 @@
((ConfigurationImpl) config).deferBootstrapOverrides();
}
if (factory == null) {
- factory = config.buildValidatorFactory();
+ factory = new Lazy<>(config::buildValidatorFactory);
}
- validator = factory.getValidator();
+ validator = new Lazy<>(() -> factory.get().getValidator());
}
public Set<ExecutableType> getGlobalExecutableTypes() {
@@ -136,7 +137,7 @@
try {
ensureFactoryValidator();
try {
- final BeanDescriptor classConstraints = validator.getConstraintsForClass(javaClass);
+ final BeanDescriptor classConstraints = validator.get().getConstraintsForClass(javaClass);
final boolean validConstructors = globalExecutableTypes.contains(ExecutableType.CONSTRUCTORS)
&& !classConstraints.getConstrainedConstructors().isEmpty();
@@ -189,37 +190,30 @@
}
public void addBValBeans(final @Observes AfterBeanDiscovery afterBeanDiscovery, final BeanManager beanManager) {
- if (factory != null) { // cleanup cache used to discover ValidateOnException before factory is recreated
- factory.close();
+ if (factory != null && factory.optional().isPresent()) { // cleanup cache used to discover ValidateOnException before factory is recreated
+ factory.get().close();
}
if (config instanceof ConfigurationImpl) {
((ConfigurationImpl) config).releaseDeferredBootstrapOverrides();
}
if (!validatorFactoryFound) {
try { // recreate the factory
- afterBeanDiscovery.addBean(new ValidatorFactoryBean(factory = config.buildValidatorFactory()));
+ factory = new Lazy<>(config::buildValidatorFactory);
+ afterBeanDiscovery.addBean(new ValidatorFactoryBean(factory));
+ validatorFactoryFound = true;
+ } catch (final ValidationException ve) {
+ //throw ve;
} catch (final Exception e) { // can throw an exception with custom providers
- if (e instanceof ValidationException) {
- throw e;
- }
LOGGER.log(Level.SEVERE, e.getMessage(), e);
}
}
- if (!validatorFound) {
+ if (!validatorFound && validatorFactoryFound) {
try {
- if (validatorFactoryFound) {
- factory = config.buildValidatorFactory();
- } // else fresh factory already created in previous if
- if (factory != null) { // happens in TCKS
- afterBeanDiscovery.addBean(new ValidatorBean(factory, factory.getValidator()));
- validatorFound = true;
- }
- } catch (final Exception e) { // getValidator can throw an exception with custom providers
- if (e instanceof ValidationException) {
- throw e;
- }
- afterBeanDiscovery.addBean(new ValidatorBean(factory, null));
+ afterBeanDiscovery.addBean(new ValidatorBean(() -> CDI.current().select(ValidatorFactory.class).get().getValidator()));
validatorFound = true;
+ } catch (final ValidationException ve) {
+ throw ve;
+ } catch (final Exception e) {
LOGGER.log(Level.SEVERE, e.getMessage(), e);
}
}
@@ -243,7 +237,7 @@
it.inject(instance, context);
it.postConstruct(instance);
- return new Releasable<T>(context, it, instance);
+ return new Releasable<>(context, it, instance);
} catch (final Exception | NoClassDefFoundError error) {
// no-op
}
diff --git a/bval-jsr/src/main/java/org/apache/bval/cdi/ValidatorBean.java b/bval-jsr/src/main/java/org/apache/bval/cdi/ValidatorBean.java
index cd17fae..ee4f152 100644
--- a/bval-jsr/src/main/java/org/apache/bval/cdi/ValidatorBean.java
+++ b/bval-jsr/src/main/java/org/apache/bval/cdi/ValidatorBean.java
@@ -24,12 +24,12 @@
import javax.enterprise.inject.spi.InjectionPoint;
import javax.enterprise.inject.spi.PassivationCapable;
import javax.validation.Validator;
-import javax.validation.ValidatorFactory;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
+import java.util.function.Supplier;
/**
* {@link Validator} CDI {@link Bean}.
@@ -37,11 +37,9 @@
public class ValidatorBean implements Bean<Validator>, PassivationCapable {
private final Set<Type> types;
private final Set<Annotation> qualifiers;
- private final ValidatorFactory factory;
- private volatile Validator instance;
+ private final Supplier<Validator> instance;
- public ValidatorBean(final ValidatorFactory factory, final Validator validator) {
- this.factory = factory;
+ public ValidatorBean(final Supplier<Validator> validator) {
this.instance = validator;
final Set<Type> t = new HashSet<>();
@@ -102,14 +100,7 @@
@Override
public Validator create(final CreationalContext<Validator> context) {
- if (instance == null) {
- synchronized (this) {
- if (instance == null) {
- instance = factory.getValidator();
- }
- }
- }
- return instance;
+ return instance == null ? null : instance.get();
}
@Override
diff --git a/bval-jsr/src/main/java/org/apache/bval/cdi/ValidatorFactoryBean.java b/bval-jsr/src/main/java/org/apache/bval/cdi/ValidatorFactoryBean.java
index 0a8c2e5..8dd7073 100644
--- a/bval-jsr/src/main/java/org/apache/bval/cdi/ValidatorFactoryBean.java
+++ b/bval-jsr/src/main/java/org/apache/bval/cdi/ValidatorFactoryBean.java
@@ -29,6 +29,7 @@
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
+import java.util.function.Supplier;
/**
* {@link ValidatorFactory} CDI {@link Bean}.
@@ -36,9 +37,9 @@
public class ValidatorFactoryBean implements Bean<ValidatorFactory>, PassivationCapable {
private final Set<Type> types;
private final Set<Annotation> qualifiers;
- private final ValidatorFactory instance;
+ private final Supplier<ValidatorFactory> instance;
- public ValidatorFactoryBean(final ValidatorFactory validatorFactory) {
+ public ValidatorFactoryBean(final Supplier<ValidatorFactory> validatorFactory) {
this.instance = validatorFactory;
final Set<Type> t = new HashSet<>();
@@ -99,7 +100,7 @@
@Override
public ValidatorFactory create(final CreationalContext<ValidatorFactory> context) {
- return instance;
+ return instance.get();
}
@Override
diff --git a/bval-tck/work-tests-suite.xml b/bval-tck/work-tests-suite.xml
index 8bc248c..a6c08c6 100644
--- a/bval-tck/work-tests-suite.xml
+++ b/bval-tck/work-tests-suite.xml
@@ -22,7 +22,7 @@
<test name="tmp">
<classes>
<!-- <class name="org.hibernate.beanvalidation.tck.tests.xmlconfiguration.groupconversion.containerelement.XmlBasedContainerElementGroupConversionValidationTest"/> -->
- <class name="org.hibernate.beanvalidation.tck.tests.validation.CustomPropertyPathTest"/>
+ <class name="org.hibernate.beanvalidation.tck.tests.bootstrap.BootstrapConfigurationTest"/>
<!--
<class name="org.hibernate.beanvalidation.tck.tests.util.ConstraintViolationAssertTest"/>
-->