17
17
import java .util .function .Predicate ;
18
18
import java .util .regex .Pattern ;
19
19
20
+ import jakarta .enterprise .inject .Instance ;
21
+ import jakarta .inject .Named ;
20
22
import jakarta .inject .Singleton ;
21
23
import jakarta .validation .ClockProvider ;
22
24
import jakarta .validation .Constraint ;
28
30
import jakarta .validation .Valid ;
29
31
import jakarta .validation .Validation ;
30
32
import jakarta .validation .ValidationException ;
33
+ import jakarta .validation .Validator ;
31
34
import jakarta .validation .ValidatorFactory ;
32
35
import jakarta .validation .executable .ValidateOnExecution ;
33
36
import jakarta .validation .valueextraction .ValueExtractor ;
34
37
import jakarta .ws .rs .Priorities ;
35
38
39
+ import org .hibernate .validator .HibernateValidatorFactory ;
36
40
import org .hibernate .validator .internal .metadata .core .ConstraintHelper ;
37
41
import org .hibernate .validator .messageinterpolation .AbstractMessageInterpolator ;
38
42
import org .hibernate .validator .spi .messageinterpolation .LocaleResolver ;
42
46
import org .jboss .jandex .AnnotationInstance ;
43
47
import org .jboss .jandex .AnnotationTarget ;
44
48
import org .jboss .jandex .ClassInfo ;
49
+ import org .jboss .jandex .ClassType ;
45
50
import org .jboss .jandex .CompositeIndex ;
46
51
import org .jboss .jandex .DotName ;
47
52
import org .jboss .jandex .IndexView ;
48
53
import org .jboss .jandex .Indexer ;
49
54
import org .jboss .jandex .MethodInfo ;
55
+ import org .jboss .jandex .ParameterizedType ;
50
56
import org .jboss .jandex .Type ;
51
57
import org .jboss .logging .Logger ;
52
58
import org .objectweb .asm .ClassVisitor ;
53
59
import org .objectweb .asm .MethodVisitor ;
54
60
import org .objectweb .asm .Opcodes ;
55
61
62
+ import io .quarkus .arc .BeanDestroyer ;
56
63
import io .quarkus .arc .deployment .AdditionalBeanBuildItem ;
57
64
import io .quarkus .arc .deployment .AnnotationsTransformerBuildItem ;
58
65
import io .quarkus .arc .deployment .AutoAddScopeBuildItem ;
59
66
import io .quarkus .arc .deployment .BeanArchiveIndexBuildItem ;
67
+ import io .quarkus .arc .deployment .BeanContainerBuildItem ;
60
68
import io .quarkus .arc .deployment .BeanContainerListenerBuildItem ;
61
69
import io .quarkus .arc .deployment .SyntheticBeanBuildItem ;
62
70
import io .quarkus .arc .deployment .UnremovableBeanBuildItem ;
88
96
import io .quarkus .deployment .builditem .nativeimage .ReflectiveFieldBuildItem ;
89
97
import io .quarkus .deployment .builditem .nativeimage .ReflectiveMethodBuildItem ;
90
98
import io .quarkus .deployment .builditem .nativeimage .RuntimeReinitializedClassBuildItem ;
99
+ import io .quarkus .deployment .builditem .nativeimage .ServiceProviderBuildItem ;
91
100
import io .quarkus .deployment .logging .LogCleanupFilterBuildItem ;
92
101
import io .quarkus .deployment .pkg .steps .NativeOrNativeSourcesBuild ;
93
102
import io .quarkus .deployment .recording .RecorderContext ;
103
112
import io .quarkus .hibernate .validator .runtime .HibernateValidatorBuildTimeConfig ;
104
113
import io .quarkus .hibernate .validator .runtime .HibernateValidatorRecorder ;
105
114
import io .quarkus .hibernate .validator .runtime .ValidationSupport ;
106
- import io .quarkus .hibernate .validator .runtime .ValidatorProvider ;
107
115
import io .quarkus .hibernate .validator .runtime .interceptor .MethodValidationInterceptor ;
108
116
import io .quarkus .hibernate .validator .runtime .jaxrs .ResteasyConfigSupport ;
109
117
import io .quarkus .hibernate .validator .runtime .jaxrs .ResteasyReactiveViolationExceptionMapper ;
110
118
import io .quarkus .hibernate .validator .runtime .jaxrs .ResteasyViolationExceptionMapper ;
111
119
import io .quarkus .hibernate .validator .runtime .jaxrs .ViolationReport ;
120
+ import io .quarkus .hibernate .validator .runtime .locale .LocaleResolversWrapper ;
112
121
import io .quarkus .hibernate .validator .spi .AdditionalConstrainedClassBuildItem ;
113
122
import io .quarkus .hibernate .validator .spi .BeanValidationAnnotationsBuildItem ;
114
123
import io .quarkus .jaxrs .spi .deployment .AdditionalJaxRsResourceMethodAnnotationsBuildItem ;
@@ -127,10 +136,13 @@ class HibernateValidatorProcessor {
127
136
private static final Logger LOG = Logger .getLogger (HibernateValidatorProcessor .class );
128
137
129
138
private static final String META_INF_VALIDATION_XML = "META-INF/validation.xml" ;
139
+ public static final String VALIDATOR_FACTORY_NAME = "quarkus-hibernate-validator-factory" ;
130
140
141
+ private static final DotName CDI_INSTANCE = DotName .createSimple (Instance .class );
131
142
private static final DotName CONSTRAINT_VALIDATOR_FACTORY = DotName
132
143
.createSimple (ConstraintValidatorFactory .class .getName ());
133
144
private static final DotName MESSAGE_INTERPOLATOR = DotName .createSimple (MessageInterpolator .class .getName ());
145
+ private static final DotName LOCAL_RESOLVER_WRAPPER = DotName .createSimple (LocaleResolversWrapper .class );
134
146
private static final DotName LOCALE_RESOLVER = DotName .createSimple (LocaleResolver .class .getName ());
135
147
136
148
private static final DotName TRAVERSABLE_RESOLVER = DotName .createSimple (TraversableResolver .class .getName ());
@@ -393,8 +405,6 @@ void registerAdditionalBeans(HibernateValidatorRecorder hibernateValidatorRecord
393
405
BuildProducer <SyntheticBeanBuildItem > syntheticBeanBuildItems ,
394
406
BuildProducer <ResteasyJaxrsProviderBuildItem > resteasyJaxrsProvider ,
395
407
Capabilities capabilities ) {
396
- // The bean encapsulating the Validator and ValidatorFactory
397
- additionalBeans .produce (new AdditionalBeanBuildItem (ValidatorProvider .class ));
398
408
399
409
// The CDI interceptor which will validate the methods annotated with @MethodValidated
400
410
additionalBeans .produce (new AdditionalBeanBuildItem (MethodValidationInterceptor .class ));
@@ -452,7 +462,10 @@ public void build(
452
462
BeanValidationAnnotationsBuildItem beanValidationAnnotations ,
453
463
BuildProducer <ReflectiveFieldBuildItem > reflectiveFields ,
454
464
BuildProducer <ReflectiveMethodBuildItem > reflectiveMethods ,
465
+ BuildProducer <ReflectiveClassBuildItem > reflectiveClass ,
466
+ BuildProducer <ServiceProviderBuildItem > serviceProvider ,
455
467
BuildProducer <AnnotationsTransformerBuildItem > annotationsTransformers ,
468
+ BuildProducer <SyntheticBeanBuildItem > syntheticBeans ,
456
469
BeanArchiveIndexBuildItem beanArchiveIndexBuildItem ,
457
470
CombinedIndexBuildItem combinedIndexBuildItem ,
458
471
Optional <AdditionalConstrainedClassesIndexBuildItem > additionalConstrainedClassesIndexBuildItem ,
@@ -586,15 +599,56 @@ public void build(
586
599
valueExtractorClassProxies .add (recorderContext .classProxy (className .toString ()));
587
600
}
588
601
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 ());
598
652
}
599
653
600
654
@ BuildStep
0 commit comments