Skip to content

Commit 86d200b

Browse files
geoandgsmet
andcommitted
Use SyntheticBeanBuildItem to construct HibernateValidatorFactory
Fixes: quarkusio#47945 Co-authored-by: Guillaume Smet <[email protected]>
1 parent 58f1455 commit 86d200b

File tree

5 files changed

+150
-111
lines changed

5 files changed

+150
-111
lines changed

extensions/hibernate-validator/deployment/src/main/java/io/quarkus/hibernate/validator/deployment/HibernateValidatorProcessor.java

Lines changed: 66 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
import java.util.function.Predicate;
1818
import java.util.regex.Pattern;
1919

20+
import jakarta.enterprise.inject.Instance;
21+
import jakarta.inject.Named;
2022
import jakarta.inject.Singleton;
2123
import jakarta.validation.ClockProvider;
2224
import jakarta.validation.Constraint;
@@ -28,11 +30,13 @@
2830
import jakarta.validation.Valid;
2931
import jakarta.validation.Validation;
3032
import jakarta.validation.ValidationException;
33+
import jakarta.validation.Validator;
3134
import jakarta.validation.ValidatorFactory;
3235
import jakarta.validation.executable.ValidateOnExecution;
3336
import jakarta.validation.valueextraction.ValueExtractor;
3437
import jakarta.ws.rs.Priorities;
3538

39+
import org.hibernate.validator.HibernateValidatorFactory;
3640
import org.hibernate.validator.internal.metadata.core.ConstraintHelper;
3741
import org.hibernate.validator.messageinterpolation.AbstractMessageInterpolator;
3842
import org.hibernate.validator.spi.messageinterpolation.LocaleResolver;
@@ -42,21 +46,25 @@
4246
import org.jboss.jandex.AnnotationInstance;
4347
import org.jboss.jandex.AnnotationTarget;
4448
import org.jboss.jandex.ClassInfo;
49+
import org.jboss.jandex.ClassType;
4550
import org.jboss.jandex.CompositeIndex;
4651
import org.jboss.jandex.DotName;
4752
import org.jboss.jandex.IndexView;
4853
import org.jboss.jandex.Indexer;
4954
import org.jboss.jandex.MethodInfo;
55+
import org.jboss.jandex.ParameterizedType;
5056
import org.jboss.jandex.Type;
5157
import org.jboss.logging.Logger;
5258
import org.objectweb.asm.ClassVisitor;
5359
import org.objectweb.asm.MethodVisitor;
5460
import org.objectweb.asm.Opcodes;
5561

62+
import io.quarkus.arc.BeanDestroyer;
5663
import io.quarkus.arc.deployment.AdditionalBeanBuildItem;
5764
import io.quarkus.arc.deployment.AnnotationsTransformerBuildItem;
5865
import io.quarkus.arc.deployment.AutoAddScopeBuildItem;
5966
import io.quarkus.arc.deployment.BeanArchiveIndexBuildItem;
67+
import io.quarkus.arc.deployment.BeanContainerBuildItem;
6068
import io.quarkus.arc.deployment.BeanContainerListenerBuildItem;
6169
import io.quarkus.arc.deployment.SyntheticBeanBuildItem;
6270
import io.quarkus.arc.deployment.UnremovableBeanBuildItem;
@@ -88,6 +96,7 @@
8896
import io.quarkus.deployment.builditem.nativeimage.ReflectiveFieldBuildItem;
8997
import io.quarkus.deployment.builditem.nativeimage.ReflectiveMethodBuildItem;
9098
import io.quarkus.deployment.builditem.nativeimage.RuntimeReinitializedClassBuildItem;
99+
import io.quarkus.deployment.builditem.nativeimage.ServiceProviderBuildItem;
91100
import io.quarkus.deployment.logging.LogCleanupFilterBuildItem;
92101
import io.quarkus.deployment.pkg.steps.NativeOrNativeSourcesBuild;
93102
import io.quarkus.deployment.recording.RecorderContext;
@@ -103,12 +112,12 @@
103112
import io.quarkus.hibernate.validator.runtime.HibernateValidatorBuildTimeConfig;
104113
import io.quarkus.hibernate.validator.runtime.HibernateValidatorRecorder;
105114
import io.quarkus.hibernate.validator.runtime.ValidationSupport;
106-
import io.quarkus.hibernate.validator.runtime.ValidatorProvider;
107115
import io.quarkus.hibernate.validator.runtime.interceptor.MethodValidationInterceptor;
108116
import io.quarkus.hibernate.validator.runtime.jaxrs.ResteasyConfigSupport;
109117
import io.quarkus.hibernate.validator.runtime.jaxrs.ResteasyReactiveViolationExceptionMapper;
110118
import io.quarkus.hibernate.validator.runtime.jaxrs.ResteasyViolationExceptionMapper;
111119
import io.quarkus.hibernate.validator.runtime.jaxrs.ViolationReport;
120+
import io.quarkus.hibernate.validator.runtime.locale.LocaleResolversWrapper;
112121
import io.quarkus.hibernate.validator.spi.AdditionalConstrainedClassBuildItem;
113122
import io.quarkus.hibernate.validator.spi.BeanValidationAnnotationsBuildItem;
114123
import io.quarkus.jaxrs.spi.deployment.AdditionalJaxRsResourceMethodAnnotationsBuildItem;
@@ -127,10 +136,13 @@ class HibernateValidatorProcessor {
127136
private static final Logger LOG = Logger.getLogger(HibernateValidatorProcessor.class);
128137

129138
private static final String META_INF_VALIDATION_XML = "META-INF/validation.xml";
139+
public static final String VALIDATOR_FACTORY_NAME = "quarkus-hibernate-validator-factory";
130140

141+
private static final DotName CDI_INSTANCE = DotName.createSimple(Instance.class);
131142
private static final DotName CONSTRAINT_VALIDATOR_FACTORY = DotName
132143
.createSimple(ConstraintValidatorFactory.class.getName());
133144
private static final DotName MESSAGE_INTERPOLATOR = DotName.createSimple(MessageInterpolator.class.getName());
145+
private static final DotName LOCAL_RESOLVER_WRAPPER = DotName.createSimple(LocaleResolversWrapper.class);
134146
private static final DotName LOCALE_RESOLVER = DotName.createSimple(LocaleResolver.class.getName());
135147

136148
private static final DotName TRAVERSABLE_RESOLVER = DotName.createSimple(TraversableResolver.class.getName());
@@ -393,8 +405,6 @@ void registerAdditionalBeans(HibernateValidatorRecorder hibernateValidatorRecord
393405
BuildProducer<SyntheticBeanBuildItem> syntheticBeanBuildItems,
394406
BuildProducer<ResteasyJaxrsProviderBuildItem> resteasyJaxrsProvider,
395407
Capabilities capabilities) {
396-
// The bean encapsulating the Validator and ValidatorFactory
397-
additionalBeans.produce(new AdditionalBeanBuildItem(ValidatorProvider.class));
398408

399409
// The CDI interceptor which will validate the methods annotated with @MethodValidated
400410
additionalBeans.produce(new AdditionalBeanBuildItem(MethodValidationInterceptor.class));
@@ -452,7 +462,10 @@ public void build(
452462
BeanValidationAnnotationsBuildItem beanValidationAnnotations,
453463
BuildProducer<ReflectiveFieldBuildItem> reflectiveFields,
454464
BuildProducer<ReflectiveMethodBuildItem> reflectiveMethods,
465+
BuildProducer<ReflectiveClassBuildItem> reflectiveClass,
466+
BuildProducer<ServiceProviderBuildItem> serviceProvider,
455467
BuildProducer<AnnotationsTransformerBuildItem> annotationsTransformers,
468+
BuildProducer<SyntheticBeanBuildItem> syntheticBeans,
456469
BeanArchiveIndexBuildItem beanArchiveIndexBuildItem,
457470
CombinedIndexBuildItem combinedIndexBuildItem,
458471
Optional<AdditionalConstrainedClassesIndexBuildItem> additionalConstrainedClassesIndexBuildItem,
@@ -586,15 +599,56 @@ public void build(
586599
valueExtractorClassProxies.add(recorderContext.classProxy(className.toString()));
587600
}
588601

589-
beanContainerListener
590-
.produce(new BeanContainerListenerBuildItem(
591-
recorder.initializeValidatorFactory(classesToBeValidated, detectedBuiltinConstraints,
592-
valueExtractorClassProxies,
593-
hasXmlConfiguration(),
594-
capabilities.isPresent(Capability.HIBERNATE_ORM),
595-
shutdownContext,
596-
localesBuildTimeConfig,
597-
hibernateValidatorBuildTimeConfig)));
602+
syntheticBeans.produce(SyntheticBeanBuildItem
603+
.configure(HibernateValidatorFactory.class)
604+
.types(ValidatorFactory.class)
605+
.unremovable()
606+
.scope(BuiltinScope.SINGLETON.getInfo())
607+
.createWith(recorder.hibernateValidatorFactory(classesToBeValidated, detectedBuiltinConstraints,
608+
valueExtractorClassProxies,
609+
hasXmlConfiguration(),
610+
capabilities.isPresent(Capability.HIBERNATE_ORM),
611+
localesBuildTimeConfig,
612+
hibernateValidatorBuildTimeConfig))
613+
.addQualifier().annotation(DotNames.NAMED).addValue("value", VALIDATOR_FACTORY_NAME).done()
614+
.destroyer(BeanDestroyer.AutoCloseableDestroyer.class)
615+
.addInjectionPoint(ParameterizedType.create(CDI_INSTANCE,
616+
new Type[] { ClassType.create(LOCAL_RESOLVER_WRAPPER) }, null),
617+
AnnotationInstance.builder(Named.class).add("value", "locale-resolver-wrapper").build())
618+
.addInjectionPoint(ParameterizedType.create(CDI_INSTANCE,
619+
new Type[] { ClassType.create(CONSTRAINT_VALIDATOR_FACTORY) }, null))
620+
.addInjectionPoint(ParameterizedType.create(CDI_INSTANCE,
621+
new Type[] { ClassType.create(MESSAGE_INTERPOLATOR) }, null))
622+
.addInjectionPoint(ParameterizedType.create(CDI_INSTANCE,
623+
new Type[] { ClassType.create(TRAVERSABLE_RESOLVER) }, null))
624+
.addInjectionPoint(ParameterizedType.create(CDI_INSTANCE,
625+
new Type[] { ClassType.create(PARAMETER_NAME_PROVIDER) }, null))
626+
.addInjectionPoint(ParameterizedType.create(CDI_INSTANCE,
627+
new Type[] { ClassType.create(CLOCK_PROVIDER) }, null))
628+
.addInjectionPoint(ParameterizedType.create(CDI_INSTANCE,
629+
new Type[] { ClassType.create(SCRIPT_EVALUATOR_FACTORY) }, null))
630+
.addInjectionPoint(ParameterizedType.create(CDI_INSTANCE,
631+
new Type[] { ClassType.create(GETTER_PROPERTY_SELECTION_STRATEGY) }, null))
632+
.addInjectionPoint(ParameterizedType.create(CDI_INSTANCE,
633+
new Type[] { ClassType.create(PROPERTY_NODE_NAME_PROVIDER) }, null))
634+
.addInjectionPoint(ParameterizedType.create(CDI_INSTANCE,
635+
new Type[] { ClassType.create(VALIDATOR_FACTORY_CUSTOMIZER) }, null))
636+
.done());
637+
638+
syntheticBeans.produce(SyntheticBeanBuildItem
639+
.configure(Validator.class)
640+
.unremovable()
641+
.scope(BuiltinScope.SINGLETON.getInfo())
642+
.createWith(recorder.hibernateValidator(VALIDATOR_FACTORY_NAME))
643+
.addInjectionPoint(ClassType.create(HibernateValidatorFactory.class),
644+
AnnotationInstance.builder(DotNames.NAMED).value(VALIDATOR_FACTORY_NAME).build())
645+
.done());
646+
}
647+
648+
@BuildStep
649+
@Record(STATIC_INIT)
650+
public void init(BeanContainerBuildItem beanContainerBuildItem, HibernateValidatorRecorder recorder) {
651+
recorder.hibernateValidatorFactoryInit(beanContainerBuildItem.getValue());
598652
}
599653

600654
@BuildStep

0 commit comments

Comments
 (0)