Repository: quarkusio/quarkus
Pull request #47947: Use SyntheticBeanBuildItem to construct HibernateValidatorFactory
Author: login: geoand
Labels: name: area/hibernate-validator
description: Hibernate Validator
name: kind/bugfix
Created: 2025-05-19T17:33:28Z | Merged: 2025-05-20T19:33:41Z

- Fixes: #47945


Diff:
diff --git a/extensions/hibernate-validator/deployment/src/main/java/io/quarkus/hibernate/validator/deployment/HibernateValidatorProcessor.java b/extensions/hibernate-validator/deployment/src/main/java/io/quarkus/hibernate/validator/deployment/HibernateValidatorProcessor.java
index 29ecc6db83048..3c3ebb453c6a1 100644
--- a/extensions/hibernate-validator/deployment/src/main/java/io/quarkus/hibernate/validator/deployment/HibernateValidatorProcessor.java
+++ b/extensions/hibernate-validator/deployment/src/main/java/io/quarkus/hibernate/validator/deployment/HibernateValidatorProcessor.java
@@ -17,6 +17,8 @@
 import java.util.function.Predicate;
 import java.util.regex.Pattern;
 
+import jakarta.enterprise.inject.Instance;
+import jakarta.inject.Named;
 import jakarta.inject.Singleton;
 import jakarta.validation.ClockProvider;
 import jakarta.validation.Constraint;
@@ -28,11 +30,13 @@
 import jakarta.validation.Valid;
 import jakarta.validation.Validation;
 import jakarta.validation.ValidationException;
+import jakarta.validation.Validator;
 import jakarta.validation.ValidatorFactory;
 import jakarta.validation.executable.ValidateOnExecution;
 import jakarta.validation.valueextraction.ValueExtractor;
 import jakarta.ws.rs.Priorities;
 
+import org.hibernate.validator.HibernateValidatorFactory;
 import org.hibernate.validator.internal.metadata.core.ConstraintHelper;
 import org.hibernate.validator.messageinterpolation.AbstractMessageInterpolator;
 import org.hibernate.validator.spi.messageinterpolation.LocaleResolver;
@@ -42,21 +46,25 @@
 import org.jboss.jandex.AnnotationInstance;
 import org.jboss.jandex.AnnotationTarget;
 import org.jboss.jandex.ClassInfo;
+import org.jboss.jandex.ClassType;
 import org.jboss.jandex.CompositeIndex;
 import org.jboss.jandex.DotName;
 import org.jboss.jandex.IndexView;
 import org.jboss.jandex.Indexer;
 import org.jboss.jandex.MethodInfo;
+import org.jboss.jandex.ParameterizedType;
 import org.jboss.jandex.Type;
 import org.jboss.logging.Logger;
 import org.objectweb.asm.ClassVisitor;
 import org.objectweb.asm.MethodVisitor;
 import org.objectweb.asm.Opcodes;
 
+import io.quarkus.arc.BeanDestroyer;
 import io.quarkus.arc.deployment.AdditionalBeanBuildItem;
 import io.quarkus.arc.deployment.AnnotationsTransformerBuildItem;
 import io.quarkus.arc.deployment.AutoAddScopeBuildItem;
 import io.quarkus.arc.deployment.BeanArchiveIndexBuildItem;
+import io.quarkus.arc.deployment.BeanContainerBuildItem;
 import io.quarkus.arc.deployment.BeanContainerListenerBuildItem;
 import io.quarkus.arc.deployment.SyntheticBeanBuildItem;
 import io.quarkus.arc.deployment.UnremovableBeanBuildItem;
@@ -88,6 +96,7 @@
 import io.quarkus.deployment.builditem.nativeimage.ReflectiveFieldBuildItem;
 import io.quarkus.deployment.builditem.nativeimage.ReflectiveMethodBuildItem;
 import io.quarkus.deployment.builditem.nativeimage.RuntimeReinitializedClassBuildItem;
+import io.quarkus.deployment.builditem.nativeimage.ServiceProviderBuildItem;
 import io.quarkus.deployment.logging.LogCleanupFilterBuildItem;
 import io.quarkus.deployment.pkg.steps.NativeOrNativeSourcesBuild;
 import io.quarkus.deployment.recording.RecorderContext;
@@ -103,12 +112,12 @@
 import io.quarkus.hibernate.validator.runtime.HibernateValidatorBuildTimeConfig;
 import io.quarkus.hibernate.validator.runtime.HibernateValidatorRecorder;
 import io.quarkus.hibernate.validator.runtime.ValidationSupport;
-import io.quarkus.hibernate.validator.runtime.ValidatorProvider;
 import io.quarkus.hibernate.validator.runtime.interceptor.MethodValidationInterceptor;
 import io.quarkus.hibernate.validator.runtime.jaxrs.ResteasyConfigSupport;
 import io.quarkus.hibernate.validator.runtime.jaxrs.ResteasyReactiveViolationExceptionMapper;
 import io.quarkus.hibernate.validator.runtime.jaxrs.ResteasyViolationExceptionMapper;
 import io.quarkus.hibernate.validator.runtime.jaxrs.ViolationReport;
+import io.quarkus.hibernate.validator.runtime.locale.LocaleResolversWrapper;
 import io.quarkus.hibernate.validator.spi.AdditionalConstrainedClassBuildItem;
 import io.quarkus.hibernate.validator.spi.BeanValidationAnnotationsBuildItem;
 import io.quarkus.jaxrs.spi.deployment.AdditionalJaxRsResourceMethodAnnotationsBuildItem;
@@ -127,10 +136,13 @@ class HibernateValidatorProcessor {
     private static final Logger LOG = Logger.getLogger(HibernateValidatorProcessor.class);
 
     private static final String META_INF_VALIDATION_XML = "META-INF/validation.xml";
+    public static final String VALIDATOR_FACTORY_NAME = "quarkus-hibernate-validator-factory";
 
+    private static final DotName CDI_INSTANCE = DotName.createSimple(Instance.class);
     private static final DotName CONSTRAINT_VALIDATOR_FACTORY = DotName
             .createSimple(ConstraintValidatorFactory.class.getName());
     private static final DotName MESSAGE_INTERPOLATOR = DotName.createSimple(MessageInterpolator.class.getName());
+    private static final DotName LOCAL_RESOLVER_WRAPPER = DotName.createSimple(LocaleResolversWrapper.class);
     private static final DotName LOCALE_RESOLVER = DotName.createSimple(LocaleResolver.class.getName());
 
     private static final DotName TRAVERSABLE_RESOLVER = DotName.createSimple(TraversableResolver.class.getName());
@@ -393,8 +405,6 @@ void registerAdditionalBeans(HibernateValidatorRecorder hibernateValidatorRecord
             BuildProducer<SyntheticBeanBuildItem> syntheticBeanBuildItems,
             BuildProducer<ResteasyJaxrsProviderBuildItem> resteasyJaxrsProvider,
             Capabilities capabilities) {
-        // The bean encapsulating the Validator and ValidatorFactory
-        additionalBeans.produce(new AdditionalBeanBuildItem(ValidatorProvider.class));
 
         // The CDI interceptor which will validate the methods annotated with @MethodValidated
         additionalBeans.produce(new AdditionalBeanBuildItem(MethodValidationInterceptor.class));
@@ -452,7 +462,10 @@ public void build(
             BeanValidationAnnotationsBuildItem beanValidationAnnotations,
             BuildProducer<ReflectiveFieldBuildItem> reflectiveFields,
             BuildProducer<ReflectiveMethodBuildItem> reflectiveMethods,
+            BuildProducer<ReflectiveClassBuildItem> reflectiveClass,
+            BuildProducer<ServiceProviderBuildItem> serviceProvider,
             BuildProducer<AnnotationsTransformerBuildItem> annotationsTransformers,
+            BuildProducer<SyntheticBeanBuildItem> syntheticBeans,
             BeanArchiveIndexBuildItem beanArchiveIndexBuildItem,
             CombinedIndexBuildItem combinedIndexBuildItem,
             Optional<AdditionalConstrainedClassesIndexBuildItem> additionalConstrainedClassesIndexBuildItem,
@@ -586,15 +599,56 @@ public void build(
             valueExtractorClassProxies.add(recorderContext.classProxy(className.toString()));
         }
 
-        beanContainerListener
-                .produce(new BeanContainerListenerBuildItem(
-                        recorder.initializeValidatorFactory(classesToBeValidated, detectedBuiltinConstraints,
-                                valueExtractorClassProxies,
-                                hasXmlConfiguration(),
-                                capabilities.isPresent(Capability.HIBERNATE_ORM),
-                                shutdownContext,
-                                localesBuildTimeConfig,
-                                hibernateValidatorBuildTimeConfig)));
+        syntheticBeans.produce(SyntheticBeanBuildItem
+                .configure(HibernateValidatorFactory.class)
+                .types(ValidatorFactory.class)
+                .unremovable()
+                .scope(BuiltinScope.SINGLETON.getInfo())
+                .createWith(recorder.hibernateValidatorFactory(classesToBeValidated, detectedBuiltinConstraints,
+                        valueExtractorClassProxies,
+                        hasXmlConfiguration(),
+                        capabilities.isPresent(Capability.HIBERNATE_ORM),
+                        localesBuildTimeConfig,
+                        hibernateValidatorBuildTimeConfig))
+                .addQualifier().annotation(DotNames.NAMED).addValue("value", VALIDATOR_FACTORY_NAME).done()
+                .destroyer(BeanDestroyer.AutoCloseableDestroyer.class)
+                .addInjectionPoint(ParameterizedType.create(CDI_INSTANCE,
+                        new Type[] { ClassType.create(LOCAL_RESOLVER_WRAPPER) }, null),
+                        AnnotationInstance.builder(Named.class).add("value", "locale-resolver-wrapper").build())
+                .addInjectionPoint(ParameterizedType.create(CDI_INSTANCE,
+                        new Type[] { ClassType.create(CONSTRAINT_VALIDATOR_FACTORY) }, null))
+                .addInjectionPoint(ParameterizedType.create(CDI_INSTANCE,
+                        new Type[] { ClassType.create(MESSAGE_INTERPOLATOR) }, null))
+                .addInjectionPoint(ParameterizedType.create(CDI_INSTANCE,
+                        new Type[] { ClassType.create(TRAVERSABLE_RESOLVER) }, null))
+                .addInjectionPoint(ParameterizedType.create(CDI_INSTANCE,
+                        new Type[] { ClassType.create(PARAMETER_NAME_PROVIDER) }, null))
+                .addInjectionPoint(ParameterizedType.create(CDI_INSTANCE,
+                        new Type[] { ClassType.create(CLOCK_PROVIDER) }, null))
+                .addInjectionPoint(ParameterizedType.create(CDI_INSTANCE,
+                        new Type[] { ClassType.create(SCRIPT_EVALUATOR_FACTORY) }, null))
+                .addInjectionPoint(ParameterizedType.create(CDI_INSTANCE,
+                        new Type[] { ClassType.create(GETTER_PROPERTY_SELECTION_STRATEGY) }, null))
+                .addInjectionPoint(ParameterizedType.create(CDI_INSTANCE,
+                        new Type[] { ClassType.create(PROPERTY_NODE_NAME_PROVIDER) }, null))
+                .addInjectionPoint(ParameterizedType.create(CDI_INSTANCE,
+                        new Type[] { ClassType.create(VALIDATOR_FACTORY_CUSTOMIZER) }, null))
+                .done());
+
+        syntheticBeans.produce(SyntheticBeanBuildItem
+                .configure(Validator.class)
+                .unremovable()
+                .scope(BuiltinScope.SINGLETON.getInfo())
+                .createWith(recorder.hibernateValidator(VALIDATOR_FACTORY_NAME))
+                .addInjectionPoint(ClassType.create(HibernateValidatorFactory.class),
+                        AnnotationInstance.builder(DotNames.NAMED).value(VALIDATOR_FACTORY_NAME).build())
+                .done());
+    }
+
+    @BuildStep
+    @Record(STATIC_INIT)
+    public void init(BeanContainerBuildItem beanContainerBuildItem, HibernateValidatorRecorder recorder) {
+        recorder.hibernateValidatorFactoryInit(beanContainerBuildItem.getValue());
     }
 
     @BuildStep
diff --git a/extensions/hibernate-validator/runtime/src/main/java/io/quarkus/hibernate/validator/runtime/HibernateValidatorRecorder.java b/extensions/hibernate-validator/runtime/src/main/java/io/quarkus/hibernate/validator/runtime/HibernateValidatorRecorder.java
index 4ba2d327b45c6..c2b54bdb32a33 100644
--- a/extensions/hibernate-validator/runtime/src/main/java/io/quarkus/hibernate/validator/runtime/HibernateValidatorRecorder.java
+++ b/extensions/hibernate-validator/runtime/src/main/java/io/quarkus/hibernate/validator/runtime/HibernateValidatorRecorder.java
@@ -6,14 +6,19 @@
 import java.util.List;
 import java.util.Locale;
 import java.util.Set;
+import java.util.function.Function;
 import java.util.function.Supplier;
 
+import jakarta.enterprise.inject.Instance;
+import jakarta.enterprise.inject.literal.NamedLiteral;
+import jakarta.enterprise.util.TypeLiteral;
 import jakarta.validation.ClockProvider;
 import jakarta.validation.ConstraintValidatorFactory;
 import jakarta.validation.MessageInterpolator;
 import jakarta.validation.ParameterNameProvider;
 import jakarta.validation.TraversableResolver;
 import jakarta.validation.Validation;
+import jakarta.validation.Validator;
 import jakarta.validation.ValidatorFactory;
 import jakarta.validation.valueextraction.ValueExtractor;
 
@@ -28,11 +33,12 @@
 
 import io.quarkus.arc.Arc;
 import io.quarkus.arc.InstanceHandle;
+import io.quarkus.arc.SyntheticCreationalContext;
 import io.quarkus.arc.runtime.BeanContainer;
-import io.quarkus.arc.runtime.BeanContainerListener;
 import io.quarkus.hibernate.validator.ValidatorFactoryCustomizer;
 import io.quarkus.hibernate.validator.runtime.clockprovider.RuntimeReinitializedDefaultClockProvider;
 import io.quarkus.hibernate.validator.runtime.jaxrs.ResteasyConfigSupport;
+import io.quarkus.hibernate.validator.runtime.locale.LocaleResolversWrapper;
 import io.quarkus.runtime.LocalesBuildTimeConfig;
 import io.quarkus.runtime.ShutdownContext;
 import io.quarkus.runtime.annotations.Recorder;
@@ -40,6 +46,27 @@
 @Recorder
 public class HibernateValidatorRecorder {
 
+    private static final TypeLiteral<Instance<LocaleResolversWrapper>> INSTANCE_LOCAL_RESOLVER_WRAPPER_TYPE_LITERAL = new TypeLiteral<>() {
+    };
+    private static final TypeLiteral<Instance<ConstraintValidatorFactory>> INSTANCE_CONSTRAINT_VALIDATOR_FACTORY_TYPE_LITERAL = new TypeLiteral<>() {
+    };
+    private static final TypeLiteral<Instance<MessageInterpolator>> INSTANCE_MESSAGE_INTERPOLATOR_TYPE_LITERAL = new TypeLiteral<>() {
+    };
+    private static final TypeLiteral<Instance<TraversableResolver>> INSTANCE_TRAVERSABLE_RESOLVER_TYPE_LITERAL = new TypeLiteral<>() {
+    };
+    private static final TypeLiteral<Instance<ParameterNameProvider>> INSTANCE_PARAMETER_NAME_PROVIDER_TYPE_LITERAL = new TypeLiteral<>() {
+    };
+    private static final TypeLiteral<Instance<ClockProvider>> INSTANCE_CLOCK_PROVIDER_TYPE_LITERAL = new TypeLiteral<>() {
+    };
+    private static final TypeLiteral<Instance<ScriptEvaluatorFactory>> INSTANCE_SCRIPT_EVALUATOR_TYPE_LITERAL = new TypeLiteral<>() {
+    };
+    private static final TypeLiteral<Instance<GetterPropertySelectionStrategy>> INSTANCE_GETTER_PROPERTY_SELECTION_STRATEGY_TYPE_LITERAL = new TypeLiteral<>() {
+    };
+    private static final TypeLiteral<Instance<PropertyNodeNameProvider>> INSTANCE_PROPERTY_NODE_NAME_PROVIDER_TYPE_LITERAL = new TypeLiteral<>() {
+    };
+    private static final TypeLiteral<Instance<ValidatorFactoryCustomizer>> INSTANCE_VALIDATOR_FACTORY_CUSTOMER_TYPE_LITERAL = new TypeLiteral<>() {
+    };
+
     public void shutdownConfigValidator(ShutdownContext shutdownContext) {
         shutdownContext.addShutdownTask(new Runnable() {
             @Override
@@ -53,15 +80,15 @@ public void run() {
         });
     }
 
-    public BeanContainerListener initializeValidatorFactory(Set<Class<?>> classesToBeValidated,
+    public Function<SyntheticCreationalContext<HibernateValidatorFactory>, HibernateValidatorFactory> hibernateValidatorFactory(
+            Set<Class<?>> classesToBeValidated,
             Set<String> detectedBuiltinConstraints, Set<Class<?>> valueExtractorClasses,
             boolean hasXmlConfiguration, boolean jpaInClasspath,
-            ShutdownContext shutdownContext, LocalesBuildTimeConfig localesBuildTimeConfig,
+            LocalesBuildTimeConfig localesBuildTimeConfig,
             HibernateValidatorBuildTimeConfig hibernateValidatorBuildTimeConfig) {
-        BeanContainerListener beanContainerListener = new BeanContainerListener() {
-
+        return new Function<>() {
             @Override
-            public void created(BeanContainer container) {
+            public HibernateValidatorFactory apply(SyntheticCreationalContext<HibernateValidatorFactory> context) {
                 PredefinedScopeHibernateValidatorConfiguration configuration = Validation
                         .byProvider(PredefinedScopeHibernateValidator.class)
                         .configure();
@@ -70,10 +97,10 @@ public void created(BeanContainer container) {
                     configuration.ignoreXmlConfiguration();
                 }
 
-                LocaleResolver localeResolver = null;
-                InstanceHandle<LocaleResolver> configuredLocaleResolver = Arc.container()
-                        .instance("locale-resolver-wrapper");
-                if (configuredLocaleResolver.isAvailable()) {
+                LocaleResolver localeResolver;
+                Instance<LocaleResolversWrapper> configuredLocaleResolver = context.getInjectedReference(
+                        INSTANCE_LOCAL_RESOLVER_WRAPPER_TYPE_LITERAL, NamedLiteral.of("locale-resolver-wrapper"));
+                if (configuredLocaleResolver.isResolvable()) {
                     localeResolver = configuredLocaleResolver.get();
                     configuration.localeResolver(localeResolver);
                 }
@@ -94,23 +121,23 @@ public void created(BeanContainer container) {
                             hibernateValidatorBuildTimeConfig.expressionLanguage().constraintExpressionFeatureLevel().get());
                 }
 
-                InstanceHandle<ConstraintValidatorFactory> configuredConstraintValidatorFactory = Arc.container()
-                        .instance(ConstraintValidatorFactory.class);
-                if (configuredConstraintValidatorFactory.isAvailable()) {
+                Instance<ConstraintValidatorFactory> configuredConstraintValidatorFactory = context
+                        .getInjectedReference(INSTANCE_CONSTRAINT_VALIDATOR_FACTORY_TYPE_LITERAL);
+                if (configuredConstraintValidatorFactory.isResolvable()) {
                     configuration.constraintValidatorFactory(configuredConstraintValidatorFactory.get());
                 } else {
                     configuration.constraintValidatorFactory(new ArcConstraintValidatorFactoryImpl());
                 }
 
-                InstanceHandle<MessageInterpolator> configuredMessageInterpolator = Arc.container()
-                        .instance(MessageInterpolator.class);
-                if (configuredMessageInterpolator.isAvailable()) {
+                Instance<MessageInterpolator> configuredMessageInterpolator = context
+                        .getInjectedReference(INSTANCE_MESSAGE_INTERPOLATOR_TYPE_LITERAL);
+                if (configuredMessageInterpolator.isResolvable()) {
                     configuration.messageInterpolator(configuredMessageInterpolator.get());
                 }
 
-                InstanceHandle<TraversableResolver> configuredTraversableResolver = Arc.container()
-                        .instance(TraversableResolver.class);
-                if (configuredTraversableResolver.isAvailable()) {
+                Instance<TraversableResolver> configuredTraversableResolver = context
+                        .getInjectedReference(INSTANCE_TRAVERSABLE_RESOLVER_TYPE_LITERAL);
+                if (configuredTraversableResolver.isResolvable()) {
                     configuration.traversableResolver(configuredTraversableResolver.get());
                 } else {
                     // we still define the one we want to use so that we do not rely on runtime automatic detection
@@ -121,14 +148,15 @@ public void created(BeanContainer container) {
                     }
                 }
 
-                InstanceHandle<ParameterNameProvider> configuredParameterNameProvider = Arc.container()
-                        .instance(ParameterNameProvider.class);
-                if (configuredParameterNameProvider.isAvailable()) {
+                Instance<ParameterNameProvider> configuredParameterNameProvider = context
+                        .getInjectedReference(INSTANCE_PARAMETER_NAME_PROVIDER_TYPE_LITERAL);
+                if (configuredParameterNameProvider.isResolvable()) {
                     configuration.parameterNameProvider(configuredParameterNameProvider.get());
                 }
 
-                InstanceHandle<ClockProvider> configuredClockProvider = Arc.container().instance(ClockProvider.class);
-                if (configuredClockProvider.isAvailable()) {
+                Instance<ClockProvider> configuredClockProvider = context
+                        .getInjectedReference(INSTANCE_CLOCK_PROVIDER_TYPE_LITERAL);
+                if (configuredClockProvider.isResolvable()) {
                     configuration.clockProvider(configuredClockProvider.get());
                 } else {
                     // If user didn't provide a custom clock provider we want to set our own.
@@ -147,21 +175,21 @@ public void created(BeanContainer container) {
                 configuration.allowMultipleCascadedValidationOnReturnValues(
                         hibernateValidatorBuildTimeConfig.methodValidation().allowMultipleCascadedValidationOnReturnValues());
 
-                InstanceHandle<ScriptEvaluatorFactory> configuredScriptEvaluatorFactory = Arc.container()
-                        .instance(ScriptEvaluatorFactory.class);
-                if (configuredScriptEvaluatorFactory.isAvailable()) {
+                Instance<ScriptEvaluatorFactory> configuredScriptEvaluatorFactory = context
+                        .getInjectedReference(INSTANCE_SCRIPT_EVALUATOR_TYPE_LITERAL);
+                if (configuredScriptEvaluatorFactory.isResolvable()) {
                     configuration.scriptEvaluatorFactory(configuredScriptEvaluatorFactory.get());
                 }
 
-                InstanceHandle<GetterPropertySelectionStrategy> configuredGetterPropertySelectionStrategy = Arc.container()
-                        .instance(GetterPropertySelectionStrategy.class);
-                if (configuredGetterPropertySelectionStrategy.isAvailable()) {
+                Instance<GetterPropertySelectionStrategy> configuredGetterPropertySelectionStrategy = context
+                        .getInjectedReference(INSTANCE_GETTER_PROPERTY_SELECTION_STRATEGY_TYPE_LITERAL);
+                if (configuredGetterPropertySelectionStrategy.isResolvable()) {
                     configuration.getterPropertySelectionStrategy(configuredGetterPropertySelectionStrategy.get());
                 }
 
-                InstanceHandle<PropertyNodeNameProvider> configuredPropertyNodeNameProvider = Arc.container()
-                        .instance(PropertyNodeNameProvider.class);
-                if (configuredPropertyNodeNameProvider.isAvailable()) {
+                Instance<PropertyNodeNameProvider> configuredPropertyNodeNameProvider = context
+                        .getInjectedReference(INSTANCE_PROPERTY_NODE_NAME_PROVIDER_TYPE_LITERAL);
+                if (configuredPropertyNodeNameProvider.isResolvable()) {
                     configuration.propertyNodeNameProvider(configuredPropertyNodeNameProvider.get());
                 }
 
@@ -178,25 +206,15 @@ public void created(BeanContainer container) {
                     configuration.addValueExtractor(valueExtractor);
                 }
 
-                List<InstanceHandle<ValidatorFactoryCustomizer>> validatorFactoryCustomizers = Arc.container()
-                        .listAll(ValidatorFactoryCustomizer.class);
-                for (InstanceHandle<ValidatorFactoryCustomizer> validatorFactoryInstanceHandle : validatorFactoryCustomizers) {
-                    if (validatorFactoryInstanceHandle.isAvailable()) {
-                        final ValidatorFactoryCustomizer validatorFactoryCustomizer = validatorFactoryInstanceHandle.get();
-                        validatorFactoryCustomizer.customize(configuration);
-                    }
+                Instance<ValidatorFactoryCustomizer> validatorFactoryCustomizers = context
+                        .getInjectedReference(INSTANCE_VALIDATOR_FACTORY_CUSTOMER_TYPE_LITERAL);
+                for (ValidatorFactoryCustomizer validatorFactoryCustomizer : validatorFactoryCustomizers) {
+                    validatorFactoryCustomizer.customize(configuration);
                 }
 
                 ValidatorFactory validatorFactory = configuration.buildValidatorFactory();
-                ValidatorHolder.initialize(validatorFactory.unwrap(HibernateValidatorFactory.class));
 
-                // Close the ValidatorFactory on shutdown
-                shutdownContext.addShutdownTask(new Runnable() {
-                    @Override
-                    public void run() {
-                        validatorFactory.close();
-                    }
-                });
+                return validatorFactory.unwrap(HibernateValidatorFactory.class);
             }
 
             /**
@@ -215,8 +233,18 @@ private void filterIncompleteClasses(Set<Class<?>> classesToBeValidated) {
                 }
             }
         };
+    }
 
-        return beanContainerListener;
+    public Function<SyntheticCreationalContext<Validator>, Validator> hibernateValidator(String hibernateValidatorFactoryName) {
+        return new Function<>() {
+            @Override
+            public Validator apply(SyntheticCreationalContext<Validator> context) {
+                HibernateValidatorFactory hibernateValidatorFactory = context
+                        .getInjectedReference(HibernateValidatorFactory.class, NamedLiteral.of(hibernateValidatorFactoryName));
+
+                return hibernateValidatorFactory.getValidator();
+            }
+        };
     }
 
     // Ideally we'd retrieve all instances of a set of bean types
@@ -257,4 +285,10 @@ public ResteasyConfigSupport get() {
             }
         };
     }
+
+    // this is done in order to ensure that HibernateValidatorFactory is fully initialized at static init
+    // so completely in heap and ready to go when a native image is built
+    public void hibernateValidatorFactoryInit(BeanContainer beanContainer) {
+        HibernateValidatorFactory hibernateValidatorFactory = beanContainer.beanInstance(HibernateValidatorFactory.class);
+    }
 }
diff --git a/extensions/hibernate-validator/runtime/src/main/java/io/quarkus/hibernate/validator/runtime/ValidationSupport.java b/extensions/hibernate-validator/runtime/src/main/java/io/quarkus/hibernate/validator/runtime/ValidationSupport.java
index ff3e32843e53e..610089fe588ae 100644
--- a/extensions/hibernate-validator/runtime/src/main/java/io/quarkus/hibernate/validator/runtime/ValidationSupport.java
+++ b/extensions/hibernate-validator/runtime/src/main/java/io/quarkus/hibernate/validator/runtime/ValidationSupport.java
@@ -14,6 +14,7 @@ public final class ValidationSupport {
     private ValidationSupport() {
     }
 
+    @SuppressWarnings("unused") // this is called by transformed code
     public static ValidatorFactory buildDefaultValidatorFactory() {
         ArcContainer container = Arc.container();
         if (container == null) {
diff --git a/extensions/hibernate-validator/runtime/src/main/java/io/quarkus/hibernate/validator/runtime/ValidatorHolder.java b/extensions/hibernate-validator/runtime/src/main/java/io/quarkus/hibernate/validator/runtime/ValidatorHolder.java
deleted file mode 100644
index d6651d8354503..0000000000000
--- a/extensions/hibernate-validator/runtime/src/main/java/io/quarkus/hibernate/validator/runtime/ValidatorHolder.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package io.quarkus.hibernate.validator.runtime;
-
-import jakarta.validation.Validator;
-
-import org.hibernate.validator.HibernateValidatorFactory;
-
-public class ValidatorHolder {
-
-    private static HibernateValidatorFactory validatorFactory;
-
-    private static Validator validator;
-
-    static void initialize(HibernateValidatorFactory validatorFactory) {
-        ValidatorHolder.validatorFactory = validatorFactory;
-        ValidatorHolder.validator = validatorFactory.getValidator();
-    }
-
-    static HibernateValidatorFactory getValidatorFactory() {
-        return validatorFactory;
-    }
-
-    static Validator getValidator() {
-        return validator;
-    }
-}
diff --git a/extensions/hibernate-validator/runtime/src/main/java/io/quarkus/hibernate/validator/runtime/ValidatorProvider.java b/extensions/hibernate-validator/runtime/src/main/java/io/quarkus/hibernate/validator/runtime/ValidatorProvider.java
deleted file mode 100644
index 40490548aef99..0000000000000
--- a/extensions/hibernate-validator/runtime/src/main/java/io/quarkus/hibernate/validator/runtime/ValidatorProvider.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package io.quarkus.hibernate.validator.runtime;
-
-import jakarta.enterprise.inject.Produces;
-import jakarta.inject.Named;
-import jakarta.inject.Singleton;
-import jakarta.validation.Validator;
-
-import org.hibernate.validator.HibernateValidatorFactory;
-
-@Singleton
-public class ValidatorProvider {
-
-    @Produces
-    @Named("quarkus-hibernate-validator-factory")
-    @Singleton
-    public HibernateValidatorFactory factory() {
-        return ValidatorHolder.getValidatorFactory();
-    }
-
-    @Produces
-    @Singleton
-    public Validator validator() {
-        return ValidatorHolder.getValidator();
-    }
-}


Reviews:
user: login: gsmet
body: Yeah, so the problem is that with the new code, the `ValidatorFactory` is initialized at runtime and not at static init.

And things work atm because the VF is initialized at static init.
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-20T13:33:03Z
user: login: mkouba
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-20T14:46:30Z
user: login: geoand
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-20T14:57:26Z
user: login: gsmet
body: If you end up with a green CI, I think it's good to merge.
state: APPROVED
author_association: MEMBER
submitted_at: 2025-05-20T15:17:52Z

Review comments:
diff_hunk: @@ -284,4 +285,10 @@ public ResteasyConfigSupport get() {
             }
         };
     }
+
+    // this is done in order to ensure that HibernateValidatorFactory is fully initialized at static init
+    // so completely in heap and ready to go when a native image is built
+    public void hibernateValidatorFactoryInit(BeanContainer beanContainer) {
+        HibernateValidatorFactory hibernateValidatorFactory = beanContainer.beanInstance(HibernateValidatorFactory.class);
path: extensions/hibernate-validator/runtime/src/main/java/io/quarkus/hibernate/validator/runtime/HibernateValidatorRecorder.java
user: login: mkouba
body: Note that this only works because `HibernateValidatorFactory` is `@Singleton` and not a normal scoped bean with a client proxy.
created_at: 2025-05-20T14:46:29Z
author_association: CONTRIBUTOR
diff_hunk: @@ -284,4 +285,10 @@ public ResteasyConfigSupport get() {
             }
         };
     }
+
+    // this is done in order to ensure that HibernateValidatorFactory is fully initialized at static init
+    // so completely in heap and ready to go when a native image is built
+    public void hibernateValidatorFactoryInit(BeanContainer beanContainer) {
+        HibernateValidatorFactory hibernateValidatorFactory = beanContainer.beanInstance(HibernateValidatorFactory.class);
path: extensions/hibernate-validator/runtime/src/main/java/io/quarkus/hibernate/validator/runtime/HibernateValidatorRecorder.java
user: login: geoand
body: Yup, I'm aware.  If it were ApplicationScoped I would have called toString
created_at: 2025-05-20T14:57:26Z
author_association: CONTRIBUTOR

PR comments:
user: login: quarkus-bot[bot]
created_at: 2025-05-19T18:38:25Z
body: ---
> :waning_crescent_moon: **_This workflow status is outdated as a new workflow run has been triggered._**
---

# Status for workflow `Quarkus CI`

This is the status report for running `Quarkus CI` on commit de3a31337810acb1de7306b66cadce5cd37221bf.



## Failing Jobs



| Status | Name | Step | Failures | Logs | Raw logs | Build scan |
| :-:  | --  | --  | :-:  | :-:  | :-:  | :-:  |
| ✖ | Native Tests - Data4 | `Build` | [Failures](#user-content-test-failures-job-42498911368) | [Logs](https://github.com/quarkusio/quarkus/actions/runs/15119492750/job/42498911368) | [Raw logs](https://github.com/quarkusio/quarkus/commit/de3a31337810acb1de7306b66cadce5cd37221bf/checks/42498911368/logs) | [:mag:](https://ge.quarkus.io/s/lg5i67pckvlem) |
| ✖ | Native Tests - Main | `Build` | [Failures](#user-content-test-failures-job-42498910456) | [Logs](https://github.com/quarkusio/quarkus/actions/runs/15119492750/job/42498910456) | [Raw logs](https://github.com/quarkusio/quarkus/commit/de3a31337810acb1de7306b66cadce5cd37221bf/checks/42498910456/logs) | [:mag:](https://ge.quarkus.io/s/yw4vsx5n35gxq) |
| ✖ | Native Tests - Misc2 | `Build` | [Failures](#user-content-test-failures-job-42498913407) | [Logs](https://github.com/quarkusio/quarkus/actions/runs/15119492750/job/42498913407) | [Raw logs](https://github.com/quarkusio/quarkus/commit/de3a31337810acb1de7306b66cadce5cd37221bf/checks/42498913407/logs) | [:mag:](https://ge.quarkus.io/s/ffzcplr7obysq) |
| ✖ | Native Tests - Spring | `Build` | [Failures](#user-content-test-failures-job-42498914651) | [Logs](https://github.com/quarkusio/quarkus/actions/runs/15119492750/job/42498914651) | [Raw logs](https://github.com/quarkusio/quarkus/commit/de3a31337810acb1de7306b66cadce5cd37221bf/checks/42498914651/logs) | [:mag:](https://ge.quarkus.io/s/f5vjfvs36k6wo) |

Full information is available in the [Build summary check run](https://github.com/quarkusio/quarkus/runs/42502021599).
You can consult the [Develocity build scans](https://github.com/quarkusio/quarkus/runs/42502003272).


## Failures

### :gear: Native Tests - Data4 <a href="#user-content-test-failures-job-42498911368" id="test-failures-job-42498911368">#</a>

```diff
- Failing: integration-tests/hibernate-orm-rest-data-panache 

```

#### :package: integration-tests/hibernate-orm-rest-data-panache

<p>✖ <code>io.quarkus.it.hibernate.orm.rest.data.panache.HibernateOrmRestDataPanacheIT.shouldCreateAndDeleteBook</code> - <a href="https://ge.quarkus.io/scans/tests?tests.container=io.quarkus.it.hibernate.orm.rest.data.panache.HibernateOrmRestDataPanacheIT&tests.test=shouldCreateAndDeleteBook">History</a> - <a href="https://github.com/quarkusio/quarkus/runs/42502021599#user-content-test-failure-io.quarkus.it.hibernate.orm.rest.data.panache.hibernateormrestdatapanacheit-1">More details</a> - <a href="https://github.com/quarkusio/quarkus/blob/de3a31337810acb1de7306b66cadce5cd37221bf/integration-tests/hibernate-orm-rest-data-panache/src/test/java/io/quarkus/it/hibernate/orm/rest/data/panache/HibernateOrmRestDataPanacheIT.java">Source on GitHub</a></p>

<details>

```
org.opentest4j.AssertionFailedError: 

expected: 201
 but was: 500
	at io.quarkus.it.hibernate.orm.rest.data.panache.HibernateOrmRestDataPanacheTest.shouldCreateAndDeleteBook(HibernateOrmRestDataPanacheTest.java:214)
	at java.base/java.lang.reflect.Method.invoke(Method.java:569)
	at io.quarkus.test.junit.QuarkusTestExtension.interceptTestMethod(QuarkusTestExtension.java:837)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
```

</details>

<p>✖ <code>io.quarkus.it.hibernate.orm.rest.data.panache.HibernateOrmRestDataPanacheIT.shouldCreateUpdateAndDeleteBook</code> - <a href="https://ge.quarkus.io/scans/tests?tests.container=io.quarkus.it.hibernate.orm.rest.data.panache.HibernateOrmRestDataPanacheIT&tests.test=shouldCreateUpdateAndDeleteBook">History</a> - <a href="https://github.com/quarkusio/quarkus/runs/42502021599#user-content-test-failure-io.quarkus.it.hibernate.orm.rest.data.panache.hibernateormrestdatapanacheit-2">More details</a> - <a href="https://github.com/quarkusio/quarkus/blob/de3a31337810acb1de7306b66cadce5cd37221bf/integration-tests/hibernate-orm-rest-data-panache/src/test/java/io/quarkus/it/hibernate/orm/rest/data/panache/HibernateOrmRestDataPanacheIT.java">Source on GitHub</a></p>

<details>

```
org.opentest4j.AssertionFailedError: 

expected: 201
 but was: 500
	at io.quarkus.it.hibernate.orm.rest.data.panache.HibernateOrmRestDataPanacheTest.shouldCreateUpdateAndDeleteBook(HibernateOrmRestDataPanacheTest.java:273)
	at java.base/java.lang.reflect.Method.invoke(Method.java:569)
	at io.quarkus.test.junit.QuarkusTestExtension.interceptTestMethod(QuarkusTestExtension.java:837)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
```

</details>

<p>✖ <code>io.quarkus.it.hibernate.orm.rest.data.panache.HibernateOrmRestDataPanacheIT.shouldNotCreateBookWithBlankTitle</code> - <a href="https://ge.quarkus.io/scans/tests?tests.container=io.quarkus.it.hibernate.orm.rest.data.panache.HibernateOrmRestDataPanacheIT&tests.test=shouldNotCreateBookWithBlankTitle">History</a> - <a href="https://github.com/quarkusio/quarkus/runs/42502021599#user-content-test-failure-io.quarkus.it.hibernate.orm.rest.data.panache.hibernateormrestdatapanacheit-3">More details</a> - <a href="https://github.com/quarkusio/quarkus/blob/de3a31337810acb1de7306b66cadce5cd37221bf/integration-tests/hibernate-orm-rest-data-panache/src/test/java/io/quarkus/it/hibernate/orm/rest/data/panache/HibernateOrmRestDataPanacheIT.java">Source on GitHub</a></p>

<details>

```
java.lang.AssertionError: 
1 expectation failed.
Expected status code <400> but was <500>.

	at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481)
	at org.codehaus.groovy.reflection.CachedConstructor.invoke(CachedConstructor.java:73)
	at org.codehaus.groovy.runtime.callsite.ConstructorSite$ConstructorSiteNoUnwrapNoCoerce.callConstructor(ConstructorSite.java:108)
```

</details>

<p>✖ <code>io.quarkus.it.hibernate.orm.rest.data.panache.HibernateOrmRestDataPanacheIT.shouldNotUpdateBookWithBlankTitle</code> - <a href="https://ge.quarkus.io/scans/tests?tests.container=io.quarkus.it.hibernate.orm.rest.data.panache.HibernateOrmRestDataPanacheIT&tests.test=shouldNotUpdateBookWithBlankTitle">History</a> - <a href="https://github.com/quarkusio/quarkus/runs/42502021599#user-content-test-failure-io.quarkus.it.hibernate.orm.rest.data.panache.hibernateormrestdatapanacheit-4">More details</a> - <a href="https://github.com/quarkusio/quarkus/blob/de3a31337810acb1de7306b66cadce5cd37221bf/integration-tests/hibernate-orm-rest-data-panache/src/test/java/io/quarkus/it/hibernate/orm/rest/data/panache/HibernateOrmRestDataPanacheIT.java">Source on GitHub</a></p>

<details>

```
java.lang.AssertionError: 
1 expectation failed.
Expected status code <400> but was <500>.

	at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481)
	at org.codehaus.groovy.reflection.CachedConstructor.invoke(CachedConstructor.java:73)
	at org.codehaus.groovy.runtime.callsite.ConstructorSite$ConstructorSiteNoUnwrapNoCoerce.callConstructor(ConstructorSite.java:108)
```

</details>


---

### :gear: Native Tests - Main <a href="#user-content-test-failures-job-42498910456" id="test-failures-job-42498910456">#</a>

```diff
- Failing: integration-tests/main 

```

#### :package: integration-tests/main

<p>✖ <code>io.quarkus.it.main.RBACAccessInGraalITCase.shouldRestrictAccessToSpecificRoleAndMethodParameterAnnotationsShouldntAffectAnything</code> - <a href="https://ge.quarkus.io/scans/tests?tests.container=io.quarkus.it.main.RBACAccessInGraalITCase&tests.test=shouldRestrictAccessToSpecificRoleAndMethodParameterAnnotationsShouldntAffectAnything">History</a> - <a href="https://github.com/quarkusio/quarkus/runs/42502021599#user-content-test-failure-io.quarkus.it.main.rbacaccessingraalitcase-1">More details</a> - <a href="https://github.com/quarkusio/quarkus/blob/de3a31337810acb1de7306b66cadce5cd37221bf/integration-tests/main/src/test/java/io/quarkus/it/main/RBACAccessInGraalITCase.java">Source on GitHub</a></p>

<details>

```
java.lang.AssertionError: 
1 expectation failed.
Expected status code <200> but was <500>.

	at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481)
	at org.codehaus.groovy.reflection.CachedConstructor.invoke(CachedConstructor.java:73)
	at org.codehaus.groovy.runtime.callsite.ConstructorSite$ConstructorSiteNoUnwrapNoCoerce.callConstructor(ConstructorSite.java:108)
```

</details>

<p>✖ <code>io.quarkus.it.main.SchedulerITCase.testCount</code> - <a href="https://ge.quarkus.io/scans/tests?tests.container=io.quarkus.it.main.SchedulerITCase&tests.test=testCount">History</a> - <a href="https://github.com/quarkusio/quarkus/runs/42502021599#user-content-test-failure-io.quarkus.it.main.scheduleritcase-2">More details</a> - <a href="https://github.com/quarkusio/quarkus/blob/de3a31337810acb1de7306b66cadce5cd37221bf/integration-tests/main/src/test/java/io/quarkus/it/main/SchedulerITCase.java">Source on GitHub</a></p>

<details>

```
org.opentest4j.AssertionFailedError: expected: <true> but was: <false>
	at io.quarkus.it.main.SchedulerTestCase.testCount(SchedulerTestCase.java:22)
	at java.base/java.lang.reflect.Method.invoke(Method.java:569)
	at io.quarkus.test.junit.QuarkusTestExtension.interceptTestMethod(QuarkusTestExtension.java:837)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
```

</details>

<p>✖ <code>io.quarkus.it.main.ValidatorITCase.testManualValidationFailed</code> - <a href="https://ge.quarkus.io/scans/tests?tests.container=io.quarkus.it.main.ValidatorITCase&tests.test=testManualValidationFailed">History</a> - <a href="https://github.com/quarkusio/quarkus/runs/42502021599#user-content-test-failure-io.quarkus.it.main.validatoritcase-3">More details</a> - <a href="https://github.com/quarkusio/quarkus/blob/de3a31337810acb1de7306b66cadce5cd37221bf/integration-tests/main/src/test/java/io/quarkus/it/main/ValidatorITCase.java">Source on GitHub</a></p>

<details>

```
java.io.IOException: Server returned HTTP response code: 500 for URL: http://localhost:8081/validator/manual
	at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:2037)
	at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1626)
	at io.quarkus.it.main.ValidatorTestCase.testManualValidationFailed(ValidatorTestCase.java:42)
	at java.base/java.lang.reflect.Method.invoke(Method.java:569)
	at io.quarkus.test.junit.QuarkusTestExtension.interceptTestMethod(QuarkusTestExtension.java:837)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
```

</details>

<p>✖ <code>io.quarkus.it.main.ValidatorITCase.testManualValidationPassed</code> - <a href="https://ge.quarkus.io/scans/tests?tests.container=io.quarkus.it.main.ValidatorITCase&tests.test=testManualValidationPassed">History</a> - <a href="https://github.com/quarkusio/quarkus/runs/42502021599#user-content-test-failure-io.quarkus.it.main.validatoritcase-4">More details</a> - <a href="https://github.com/quarkusio/quarkus/blob/de3a31337810acb1de7306b66cadce5cd37221bf/integration-tests/main/src/test/java/io/quarkus/it/main/ValidatorITCase.java">Source on GitHub</a></p>

<details>

```
java.io.IOException: Server returned HTTP response code: 500 for URL: http://localhost:8081/validator/manual
	at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:2037)
	at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1626)
	at io.quarkus.it.main.ValidatorTestCase.testManualValidationPassed(ValidatorTestCase.java:66)
	at java.base/java.lang.reflect.Method.invoke(Method.java:569)
	at io.quarkus.test.junit.QuarkusTestExtension.interceptTestMethod(QuarkusTestExtension.java:837)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
```

</details>


---

### :gear: Native Tests - Misc2 <a href="#user-content-test-failures-job-42498913407" id="test-failures-job-42498913407">#</a>

```diff
- Failing: integration-tests/hibernate-validator integration-tests/locales/all integration-tests/locales/default and 1 more

```

#### :package: integration-tests/hibernate-validator

<p>✖ <code>io.quarkus.it.hibernate.validator.HibernateValidatorFunctionalityInGraalITCase.testCDIBeanMethodValidation</code> - <a href="https://ge.quarkus.io/scans/tests?tests.container=io.quarkus.it.hibernate.validator.HibernateValidatorFunctionalityInGraalITCase&tests.test=testCDIBeanMethodValidation">History</a> - <a href="https://github.com/quarkusio/quarkus/runs/42502021599#user-content-test-failure-io.quarkus.it.hibernate.validator.hibernatevalidatorfunctionalityingraalitcase-1">More details</a> - <a href="https://github.com/quarkusio/quarkus/blob/de3a31337810acb1de7306b66cadce5cd37221bf/integration-tests/hibernate-validator/src/test/java/io/quarkus/it/hibernate/validator/HibernateValidatorFunctionalityInGraalITCase.java">Source on GitHub</a></p>

<details>

```
java.lang.RuntimeException: java.lang.RuntimeException: Unable to successfully launch process '2864'. Exit code is: '1'.
	at io.quarkus.test.junit.QuarkusIntegrationTestExtension.throwBootFailureException(QuarkusIntegrationTestExtension.java:343)
	at io.quarkus.test.junit.QuarkusIntegrationTestExtension.beforeEach(QuarkusIntegrationTestExtension.java:114)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
Caused by: java.lang.RuntimeException: Unable to successfully launch process '2864'. Exit code is: '1'.
	at io.quarkus.test.common.LauncherUtil.ensureProcessIsAlive(LauncherUtil.java:120)
	at io.quarkus.test.common.LauncherUtil.waitForCapturedListeningData(LauncherUtil.java:83)
```

</details>

#### :package: integration-tests/locales/all

<p>✖ <code>io.quarkus.locales.it.LocalesIT.testValidationMessageLocale(String, String)[1]</code> line <code>131</code> - <a href="https://ge.quarkus.io/scans/tests?tests.container=io.quarkus.locales.it.LocalesIT&tests.test=testValidationMessageLocale(String, String)[1]">History</a> - <a href="https://github.com/quarkusio/quarkus/runs/42502021599#user-content-test-failure-io.quarkus.locales.it.localesit-1">More details</a> - <a href="https://github.com/quarkusio/quarkus/blob/de3a31337810acb1de7306b66cadce5cd37221bf/integration-tests/locales/all/src/test/java/io/quarkus/locales/it/LocalesIT.java#L131">Source on GitHub</a></p>

<details>

```
java.lang.AssertionError: 
1 expectation failed.
Response body doesn't match expectation.
Expected: a string containing "Vrijednost ne zadovoljava uzorak"
  Actual: {"details":"Error id 5daeb333-9353-48fa-877e-d8914e76c44a-1","stack":""}

	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
```

</details>

<p>✖ <code>io.quarkus.locales.it.LocalesIT.testValidationMessageLocale(String, String)[2]</code> line <code>131</code> - <a href="https://ge.quarkus.io/scans/tests?tests.container=io.quarkus.locales.it.LocalesIT&tests.test=testValidationMessageLocale(String, String)[2]">History</a> - <a href="https://github.com/quarkusio/quarkus/runs/42502021599#user-content-test-failure-io.quarkus.locales.it.localesit-2">More details</a> - <a href="https://github.com/quarkusio/quarkus/blob/de3a31337810acb1de7306b66cadce5cd37221bf/integration-tests/locales/all/src/test/java/io/quarkus/locales/it/LocalesIT.java#L131">Source on GitHub</a></p>

<details>

```
java.lang.AssertionError: 
1 expectation failed.
Response body doesn't match expectation.
Expected: a string containing "Значення не відповідає зразку"
  Actual: {"details":"Error id 5daeb333-9353-48fa-877e-d8914e76c44a-2","stack":""}

	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
```

</details>

<p>✖ <code>io.quarkus.locales.it.LocalesIT.testValidationMessageLocale(String, String)[3]</code> line <code>131</code> - <a href="https://ge.quarkus.io/scans/tests?tests.container=io.quarkus.locales.it.LocalesIT&tests.test=testValidationMessageLocale(String, String)[3]">History</a> - <a href="https://github.com/quarkusio/quarkus/runs/42502021599#user-content-test-failure-io.quarkus.locales.it.localesit-3">More details</a> - <a href="https://github.com/quarkusio/quarkus/blob/de3a31337810acb1de7306b66cadce5cd37221bf/integration-tests/locales/all/src/test/java/io/quarkus/locales/it/LocalesIT.java#L131">Source on GitHub</a></p>

<details>

```
java.lang.AssertionError: 
1 expectation failed.
Response body doesn't match expectation.
Expected: a string containing "Value is not in line with the pattern"
  Actual: {"details":"Error id 5daeb333-9353-48fa-877e-d8914e76c44a-3","stack":""}

	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
```

</details>

<p>✖ <code>io.quarkus.locales.it.LocalesIT.testValidationMessageLocale(String, String)[4]</code> line <code>131</code> - <a href="https://ge.quarkus.io/scans/tests?tests.container=io.quarkus.locales.it.LocalesIT&tests.test=testValidationMessageLocale(String, String)[4]">History</a> - <a href="https://github.com/quarkusio/quarkus/runs/42502021599#user-content-test-failure-io.quarkus.locales.it.localesit-4">More details</a> - <a href="https://github.com/quarkusio/quarkus/blob/de3a31337810acb1de7306b66cadce5cd37221bf/integration-tests/locales/all/src/test/java/io/quarkus/locales/it/LocalesIT.java#L131">Source on GitHub</a></p>

<details>

```
java.lang.AssertionError: 
1 expectation failed.
Response body doesn't match expectation.
Expected: a string containing "Vrijednost ne zadovoljava uzorak"
  Actual: {"details":"Error id 5daeb333-9353-48fa-877e-d8914e76c44a-4","stack":""}

	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
```

</details>

<p>✖ <code>io.quarkus.locales.it.LocalesIT.testValidationMessageLocale(String, String)[5]</code> line <code>131</code> - <a href="https://ge.quarkus.io/scans/tests?tests.container=io.quarkus.locales.it.LocalesIT&tests.test=testValidationMessageLocale(String, String)[5]">History</a> - <a href="https://github.com/quarkusio/quarkus/runs/42502021599#user-content-test-failure-io.quarkus.locales.it.localesit-5">More details</a> - <a href="https://github.com/quarkusio/quarkus/blob/de3a31337810acb1de7306b66cadce5cd37221bf/integration-tests/locales/all/src/test/java/io/quarkus/locales/it/LocalesIT.java#L131">Source on GitHub</a></p>

<details>

```
java.lang.AssertionError: 
1 expectation failed.
Response body doesn't match expectation.
Expected: a string containing "數值不符合樣品"
  Actual: {"details":"Error id 5daeb333-9353-48fa-877e-d8914e76c44a-5","stack":""}

	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
```

</details>

#### :package: integration-tests/locales/default

<p>✖ <code>io.quarkus.locales.it.LocalesIT.testValidationMessageLocale(String, String)[1]</code> line <code>56</code> - <a href="https://ge.quarkus.io/scans/tests?tests.container=io.quarkus.locales.it.LocalesIT&tests.test=testValidationMessageLocale(String, String)[1]">History</a> - <a href="https://github.com/quarkusio/quarkus/runs/42502021599#user-content-test-failure-io.quarkus.locales.it.localesit-1">More details</a> - <a href="https://github.com/quarkusio/quarkus/blob/de3a31337810acb1de7306b66cadce5cd37221bf/integration-tests/locales/default/src/test/java/io/quarkus/locales/it/LocalesIT.java#L56">Source on GitHub</a></p>

<details>

```
java.lang.AssertionError: 
1 expectation failed.
Response body doesn't match expectation.
Expected: a string containing "La valeur ne correspond pas à l'échantillon"
  Actual: {"details":"Error id dddfffa1-a432-4e4b-910e-2da86f716a84-1","stack":""}

	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
```

</details>

<p>✖ <code>io.quarkus.locales.it.LocalesIT.testValidationMessageLocale(String, String)[2]</code> line <code>56</code> - <a href="https://ge.quarkus.io/scans/tests?tests.container=io.quarkus.locales.it.LocalesIT&tests.test=testValidationMessageLocale(String, String)[2]">History</a> - <a href="https://github.com/quarkusio/quarkus/runs/42502021599#user-content-test-failure-io.quarkus.locales.it.localesit-2">More details</a> - <a href="https://github.com/quarkusio/quarkus/blob/de3a31337810acb1de7306b66cadce5cd37221bf/integration-tests/locales/default/src/test/java/io/quarkus/locales/it/LocalesIT.java#L56">Source on GitHub</a></p>

<details>

```
java.lang.AssertionError: 
1 expectation failed.
Response body doesn't match expectation.
Expected: a string containing "Value is not in line with the pattern"
  Actual: {"details":"Error id dddfffa1-a432-4e4b-910e-2da86f716a84-2","stack":""}

	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
```

</details>

<p>✖ <code>io.quarkus.locales.it.LocalesIT.testValidationMessageLocale(String, String)[3]</code> line <code>56</code> - <a href="https://ge.quarkus.io/scans/tests?tests.container=io.quarkus.locales.it.LocalesIT&tests.test=testValidationMessageLocale(String, String)[3]">History</a> - <a href="https://github.com/quarkusio/quarkus/runs/42502021599#user-content-test-failure-io.quarkus.locales.it.localesit-3">More details</a> - <a href="https://github.com/quarkusio/quarkus/blob/de3a31337810acb1de7306b66cadce5cd37221bf/integration-tests/locales/default/src/test/java/io/quarkus/locales/it/LocalesIT.java#L56">Source on GitHub</a></p>

<details>

```
java.lang.AssertionError: 
1 expectation failed.
Response body doesn't match expectation.
Expected: a string containing "La valeur ne correspond pas à l'échantillon"
  Actual: {"details":"Error id dddfffa1-a432-4e4b-910e-2da86f716a84-3","stack":""}

	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
```

</details>

#### :package: integration-tests/locales/some

<p>✖ <code>io.quarkus.locales.it.LocalesIT.testValidationMessageLocale(String, String)[1]</code> line <code>152</code> - <a href="https://ge.quarkus.io/scans/tests?tests.container=io.quarkus.locales.it.LocalesIT&tests.test=testValidationMessageLocale(String, String)[1]">History</a> - <a href="https://github.com/quarkusio/quarkus/runs/42502021599#user-content-test-failure-io.quarkus.locales.it.localesit-1">More details</a> - <a href="https://github.com/quarkusio/quarkus/blob/de3a31337810acb1de7306b66cadce5cd37221bf/integration-tests/locales/some/src/test/java/io/quarkus/locales/it/LocalesIT.java#L152">Source on GitHub</a></p>

<details>

```
java.lang.AssertionError: 
1 expectation failed.
Response body doesn't match expectation.
Expected: a string containing "La valeur ne correspond pas à l'échantillon"
  Actual: {"details":"Error id 3758fe16-e4da-42cf-88fa-c9cf2c422c5e-1","stack":""}

	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
```

</details>

<p>✖ <code>io.quarkus.locales.it.LocalesIT.testValidationMessageLocale(String, String)[2]</code> line <code>152</code> - <a href="https://ge.quarkus.io/scans/tests?tests.container=io.quarkus.locales.it.LocalesIT&tests.test=testValidationMessageLocale(String, String)[2]">History</a> - <a href="https://github.com/quarkusio/quarkus/runs/42502021599#user-content-test-failure-io.quarkus.locales.it.localesit-2">More details</a> - <a href="https://github.com/quarkusio/quarkus/blob/de3a31337810acb1de7306b66cadce5cd37221bf/integration-tests/locales/some/src/test/java/io/quarkus/locales/it/LocalesIT.java#L152">Source on GitHub</a></p>

<details>

```
java.lang.AssertionError: 
1 expectation failed.
Response body doesn't match expectation.
Expected: a string containing "Value is not in line with the pattern"
  Actual: {"details":"Error id 3758fe16-e4da-42cf-88fa-c9cf2c422c5e-2","stack":""}

	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
```

</details>

<p>✖ <code>io.quarkus.locales.it.LocalesIT.testValidationMessageLocale(String, String)[3]</code> line <code>152</code> - <a href="https://ge.quarkus.io/scans/tests?tests.container=io.quarkus.locales.it.LocalesIT&tests.test=testValidationMessageLocale(String, String)[3]">History</a> - <a href="https://github.com/quarkusio/quarkus/runs/42502021599#user-content-test-failure-io.quarkus.locales.it.localesit-3">More details</a> - <a href="https://github.com/quarkusio/quarkus/blob/de3a31337810acb1de7306b66cadce5cd37221bf/integration-tests/locales/some/src/test/java/io/quarkus/locales/it/LocalesIT.java#L152">Source on GitHub</a></p>

<details>

```
java.lang.AssertionError: 
1 expectation failed.
Response body doesn't match expectation.
Expected: a string containing "La valeur ne correspond pas à l'échantillon"
  Actual: {"details":"Error id 3758fe16-e4da-42cf-88fa-c9cf2c422c5e-3","stack":""}

	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
```

</details>


---

### :gear: Native Tests - Spring <a href="#user-content-test-failures-job-42498914651" id="test-failures-job-42498914651">#</a>

```diff
- Failing: integration-tests/spring-data-rest integration-tests/spring-web 

```

#### :package: integration-tests/spring-data-rest

<p>✖ <code>io.quarkus.it.spring.data.rest.SpringDataRestIT.shouldCreateAndDeleteBook</code> - <a href="https://ge.quarkus.io/scans/tests?tests.container=io.quarkus.it.spring.data.rest.SpringDataRestIT&tests.test=shouldCreateAndDeleteBook">History</a> - <a href="https://github.com/quarkusio/quarkus/runs/42502021599#user-content-test-failure-io.quarkus.it.spring.data.rest.springdatarestit-1">More details</a> - <a href="https://github.com/quarkusio/quarkus/blob/de3a31337810acb1de7306b66cadce5cd37221bf/integration-tests/spring-data-rest/src/test/java/io/quarkus/it/spring/data/rest/SpringDataRestIT.java">Source on GitHub</a></p>

<details>

```
org.opentest4j.AssertionFailedError: 

expected: 201
 but was: 500
	at io.quarkus.it.spring.data.rest.SpringDataRestTest.shouldCreateAndDeleteBook(SpringDataRestTest.java:164)
	at java.base/java.lang.reflect.Method.invoke(Method.java:569)
	at io.quarkus.test.junit.QuarkusTestExtension.interceptTestMethod(QuarkusTestExtension.java:837)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
```

</details>

<p>✖ <code>io.quarkus.it.spring.data.rest.SpringDataRestIT.shouldCreateUpdateAndDeleteBook</code> - <a href="https://ge.quarkus.io/scans/tests?tests.container=io.quarkus.it.spring.data.rest.SpringDataRestIT&tests.test=shouldCreateUpdateAndDeleteBook">History</a> - <a href="https://github.com/quarkusio/quarkus/runs/42502021599#user-content-test-failure-io.quarkus.it.spring.data.rest.springdatarestit-2">More details</a> - <a href="https://github.com/quarkusio/quarkus/blob/de3a31337810acb1de7306b66cadce5cd37221bf/integration-tests/spring-data-rest/src/test/java/io/quarkus/it/spring/data/rest/SpringDataRestIT.java">Source on GitHub</a></p>

<details>

```
org.opentest4j.AssertionFailedError: 

expected: 201
 but was: 500
	at io.quarkus.it.spring.data.rest.SpringDataRestTest.shouldCreateUpdateAndDeleteBook(SpringDataRestTest.java:223)
	at java.base/java.lang.reflect.Method.invoke(Method.java:569)
	at io.quarkus.test.junit.QuarkusTestExtension.interceptTestMethod(QuarkusTestExtension.java:837)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
```

</details>

<p>✖ <code>io.quarkus.it.spring.data.rest.SpringDataRestIT.shouldNotCreateBookWithBlankTitle</code> - <a href="https://ge.quarkus.io/scans/tests?tests.container=io.quarkus.it.spring.data.rest.SpringDataRestIT&tests.test=shouldNotCreateBookWithBlankTitle">History</a> - <a href="https://github.com/quarkusio/quarkus/runs/42502021599#user-content-test-failure-io.quarkus.it.spring.data.rest.springdatarestit-3">More details</a> - <a href="https://github.com/quarkusio/quarkus/blob/de3a31337810acb1de7306b66cadce5cd37221bf/integration-tests/spring-data-rest/src/test/java/io/quarkus/it/spring/data/rest/SpringDataRestIT.java">Source on GitHub</a></p>

<details>

```
java.lang.AssertionError: 
1 expectation failed.
Expected status code <400> but was <500>.

	at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481)
	at org.codehaus.groovy.reflection.CachedConstructor.invoke(CachedConstructor.java:73)
	at org.codehaus.groovy.runtime.callsite.ConstructorSite$ConstructorSiteNoUnwrapNoCoerce.callConstructor(ConstructorSite.java:108)
```

</details>

<p>✖ <code>io.quarkus.it.spring.data.rest.SpringDataRestIT.shouldNotUpdateBookWithBlankTitle</code> - <a href="https://ge.quarkus.io/scans/tests?tests.container=io.quarkus.it.spring.data.rest.SpringDataRestIT&tests.test=shouldNotUpdateBookWithBlankTitle">History</a> - <a href="https://github.com/quarkusio/quarkus/runs/42502021599#user-content-test-failure-io.quarkus.it.spring.data.rest.springdatarestit-4">More details</a> - <a href="https://github.com/quarkusio/quarkus/blob/de3a31337810acb1de7306b66cadce5cd37221bf/integration-tests/spring-data-rest/src/test/java/io/quarkus/it/spring/data/rest/SpringDataRestIT.java">Source on GitHub</a></p>

<details>

```
java.lang.AssertionError: 
1 expectation failed.
Expected status code <400> but was <500>.

	at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481)
	at org.codehaus.groovy.reflection.CachedConstructor.invoke(CachedConstructor.java:73)
	at org.codehaus.groovy.runtime.callsite.ConstructorSite$ConstructorSiteNoUnwrapNoCoerce.callConstructor(ConstructorSite.java:108)
```

</details>

#### :package: integration-tests/spring-web

<p>✖ <code>io.quarkus.it.spring.web.SpringControllerIT.testJsonInputAndResult</code> - <a href="https://ge.quarkus.io/scans/tests?tests.container=io.quarkus.it.spring.web.SpringControllerIT&tests.test=testJsonInputAndResult">History</a> - <a href="https://github.com/quarkusio/quarkus/runs/42502021599#user-content-test-failure-io.quarkus.it.spring.web.springcontrollerit-1">More details</a> - <a href="https://github.com/quarkusio/quarkus/blob/de3a31337810acb1de7306b66cadce5cd37221bf/integration-tests/spring-web/src/test/java/io/quarkus/it/spring/web/SpringControllerIT.java">Source on GitHub</a></p>

<details>

```
java.lang.AssertionError: 
1 expectation failed.
Expected content-type "application/json" doesn't match actual content-type "text/plain".

	at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481)
	at org.codehaus.groovy.reflection.CachedConstructor.invoke(CachedConstructor.java:73)
	at org.codehaus.groovy.runtime.callsite.ConstructorSite$ConstructorSiteNoUnwrapNoCoerce.callConstructor(ConstructorSite.java:108)
```

</details>



<!-- Build-Reporter/msg-id:workflow-run-status-hidden:Quarkus CI -->
<!-- Build-Reporter/workflow-run-id:15119492750 -->
author_association: NONE
user: login: geoand
created_at: 2025-05-19T19:16:24Z
body: It seems like this change has caused more types to be reachable and tripping GraalVM, so it needs more work.
author_association: CONTRIBUTOR
user: login: geoand
created_at: 2025-05-20T06:56:20Z
body: I can continue adding the necessary GraalVM configurations, but I am pretty sure I am missing how things currently work in `main` WRT `native-image` for this validator extension, so I'll wait for input from @gsmet on that
author_association: CONTRIBUTOR
user: login: geoand
created_at: 2025-05-20T13:37:11Z
body: That definitely makes sense, but the way the Synthetic Bean is created, it should be static-init and not runtime init.
author_association: CONTRIBUTOR
user: login: gsmet
created_at: 2025-05-20T13:53:18Z
body: I added some debug statements and the `Function` is called when the test is executed, not during the native image build.
author_association: MEMBER
user: login: geoand
created_at: 2025-05-20T13:55:04Z
body: @mkouba what is the expectation here for synthetic beans that are `staticInit=true`? When should the function itself run?
author_association: CONTRIBUTOR
user: login: mkouba
created_at: 2025-05-20T13:59:00Z
body: > @mkouba what is the expectation here for synthetic beans that are `staticInit=true`? When should the function itself run?

The recorder is called during `ExecutionTime#STATIC_INIT`, i.e. from a generated static initializer...
author_association: CONTRIBUTOR
user: login: geoand
created_at: 2025-05-20T13:59:31Z
body: The recorder yes, but how about the function itself (the one returned by the recorder)?
author_association: CONTRIBUTOR
user: login: mkouba
created_at: 2025-05-20T14:08:30Z
body: > The recorder yes, but how about the function itself?

When the relevant bean is created. When exactly? That depends on the scope and the "clients" (e.g. other CDI beans that invoke methods of the bean).
author_association: CONTRIBUTOR
user: login: geoand
created_at: 2025-05-20T14:10:18Z
body: I see, that makes sense. Assuming the bean is `@Singleton`, is there anyway to guarantee a very eager (i.e. static init) initialization of the bean without writing some kind of dummy code?
author_association: CONTRIBUTOR
user: login: gsmet
created_at: 2025-05-20T14:21:02Z
body: Like an equivalent of `startup()` but for static init.
author_association: MEMBER
user: login: mkouba
created_at: 2025-05-20T14:24:36Z
body: > Like an equivalent of `startup()` but for static init.

Yes, there's `BeanConfiguratorBase#startup(int)`, `SyntheticBeanBuildItem.ExtendedBeanConfigurator` extends the `BeanConfiguratorBase`.
author_association: CONTRIBUTOR
user: login: gsmet
created_at: 2025-05-20T14:25:50Z
body: Yes but my understanding of `startup()` is that it will be run at runtime init?

At least my attempt to use it didn't change at thing.
author_association: MEMBER
user: login: gsmet
created_at: 2025-05-20T14:29:10Z
body: @geoand FYI, I pushed an additional commit with some further cleanup that should be squashed once we figure out how to do things properly.

I dropped the additional GraalVM stuff as it's not the way to go.
author_association: MEMBER
user: login: geoand
created_at: 2025-05-20T14:31:22Z
body: 👍🏽 

I'm also trying something to fix native.
author_association: CONTRIBUTOR
user: login: geoand
created_at: 2025-05-20T14:35:51Z
body: Okay, fixed it
author_association: CONTRIBUTOR
user: login: mkouba
created_at: 2025-05-20T14:37:01Z
body: > Yes but my understanding of `startup()` is that it will be run at runtime init?

Ah, yes you're right. I misread your comment. Normal beans can observe the `@Initialized(ApplicationScoped.class)` lifecycle event but I don't think we have something for synthetic beans. So a workaround would be (a) `Arc.container().instance(Foo.class).get()` in a recorder method or (b) create an additional class-based bean with an `@Initialized(ApplicationScoped.class)` observer that consumes `Foo`...
author_association: CONTRIBUTOR
user: login: geoand
created_at: 2025-05-20T14:42:43Z
body: I pushed a commit that should also be squashed if we agree it's the way to go.
author_association: CONTRIBUTOR
user: login: geoand
created_at: 2025-05-20T18:29:27Z
body: CI was green on my fork so I squashed, rebased and my the PR ready for review
author_association: CONTRIBUTOR
user: login: quarkus-bot[bot]
created_at: 2025-05-20T19:31:30Z
body: # Status for workflow `Quarkus CI`

This is the status report for running `Quarkus CI` on commit 86d200b1744a4885f7fe9ab68ed83089a4aab320.



:white_check_mark: The latest workflow run for the pull request has completed successfully.

It should be safe to merge provided you have a look at the other checks in the summary.

You can consult the [Develocity build scans](https://github.com/quarkusio/quarkus/runs/42582490963).


<!-- Build-Reporter/msg-id:workflow-run-status-active:Quarkus CI -->
<!-- Build-Reporter/workflow-run-id:15145121531 -->
author_association: NONE