1717import java .util .function .Predicate ;
1818import java .util .regex .Pattern ;
1919
20+ import jakarta .enterprise .inject .Instance ;
21+ import jakarta .inject .Named ;
2022import jakarta .inject .Singleton ;
2123import jakarta .validation .ClockProvider ;
2224import jakarta .validation .Constraint ;
2830import jakarta .validation .Valid ;
2931import jakarta .validation .Validation ;
3032import jakarta .validation .ValidationException ;
33+ import jakarta .validation .Validator ;
3134import jakarta .validation .ValidatorFactory ;
3235import jakarta .validation .executable .ValidateOnExecution ;
3336import jakarta .validation .valueextraction .ValueExtractor ;
3437import jakarta .ws .rs .Priorities ;
3538
39+ import org .hibernate .validator .HibernateValidatorFactory ;
3640import org .hibernate .validator .internal .metadata .core .ConstraintHelper ;
3741import org .hibernate .validator .messageinterpolation .AbstractMessageInterpolator ;
3842import org .hibernate .validator .spi .messageinterpolation .LocaleResolver ;
4246import org .jboss .jandex .AnnotationInstance ;
4347import org .jboss .jandex .AnnotationTarget ;
4448import org .jboss .jandex .ClassInfo ;
49+ import org .jboss .jandex .ClassType ;
4550import org .jboss .jandex .CompositeIndex ;
4651import org .jboss .jandex .DotName ;
4752import org .jboss .jandex .IndexView ;
4853import org .jboss .jandex .Indexer ;
4954import org .jboss .jandex .MethodInfo ;
55+ import org .jboss .jandex .ParameterizedType ;
5056import org .jboss .jandex .Type ;
5157import org .jboss .logging .Logger ;
5258import org .objectweb .asm .ClassVisitor ;
5359import org .objectweb .asm .MethodVisitor ;
5460import org .objectweb .asm .Opcodes ;
5561
62+ import io .quarkus .arc .BeanDestroyer ;
5663import io .quarkus .arc .deployment .AdditionalBeanBuildItem ;
5764import io .quarkus .arc .deployment .AnnotationsTransformerBuildItem ;
5865import io .quarkus .arc .deployment .AutoAddScopeBuildItem ;
5966import io .quarkus .arc .deployment .BeanArchiveIndexBuildItem ;
67+ import io .quarkus .arc .deployment .BeanContainerBuildItem ;
6068import io .quarkus .arc .deployment .BeanContainerListenerBuildItem ;
6169import io .quarkus .arc .deployment .SyntheticBeanBuildItem ;
6270import io .quarkus .arc .deployment .UnremovableBeanBuildItem ;
8896import io .quarkus .deployment .builditem .nativeimage .ReflectiveFieldBuildItem ;
8997import io .quarkus .deployment .builditem .nativeimage .ReflectiveMethodBuildItem ;
9098import io .quarkus .deployment .builditem .nativeimage .RuntimeReinitializedClassBuildItem ;
99+ import io .quarkus .deployment .builditem .nativeimage .ServiceProviderBuildItem ;
91100import io .quarkus .deployment .logging .LogCleanupFilterBuildItem ;
92101import io .quarkus .deployment .pkg .steps .NativeOrNativeSourcesBuild ;
93102import io .quarkus .deployment .recording .RecorderContext ;
103112import io .quarkus .hibernate .validator .runtime .HibernateValidatorBuildTimeConfig ;
104113import io .quarkus .hibernate .validator .runtime .HibernateValidatorRecorder ;
105114import io .quarkus .hibernate .validator .runtime .ValidationSupport ;
106- import io .quarkus .hibernate .validator .runtime .ValidatorProvider ;
107115import io .quarkus .hibernate .validator .runtime .interceptor .MethodValidationInterceptor ;
108116import io .quarkus .hibernate .validator .runtime .jaxrs .ResteasyConfigSupport ;
109117import io .quarkus .hibernate .validator .runtime .jaxrs .ResteasyReactiveViolationExceptionMapper ;
110118import io .quarkus .hibernate .validator .runtime .jaxrs .ResteasyViolationExceptionMapper ;
111119import io .quarkus .hibernate .validator .runtime .jaxrs .ViolationReport ;
120+ import io .quarkus .hibernate .validator .runtime .locale .LocaleResolversWrapper ;
112121import io .quarkus .hibernate .validator .spi .AdditionalConstrainedClassBuildItem ;
113122import io .quarkus .hibernate .validator .spi .BeanValidationAnnotationsBuildItem ;
114123import 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