quarkusio / quarkus

Quarkus: Supersonic Subatomic Java.
https://quarkus.io
Apache License 2.0
13.52k stars 2.61k forks source link

Email validator on collection element not found after upgrade to Quarkus 3 #35081

Closed luca-bassoricci closed 1 year ago

luca-bassoricci commented 1 year ago
@ConfigMapping(prefix = "suite")
public interface SuiteConfig
{
    Set<@NotNull @Email String> notificationEmails();
}

stops to work after upgrade from Quarkus 2.x to Quarkus 3.x (3.2.2.Final) with this stacktrace:

2023-07-28 08:43:27,400 ERROR [io.qua.dep.dev.IsolatedDevModeMain] (Quarkus Terminal Reader) Failed to start quarkus: io.quarkus.dev.appstate.ApplicationStartException: java.lang.RuntimeException: Failed to start quarkus
    at io.quarkus.dev.appstate.ApplicationStateNotification.waitForApplicationStart(ApplicationStateNotification.java:58)
    at io.quarkus.runner.bootstrap.StartupActionImpl.runMainClass(StartupActionImpl.java:123)
    at io.quarkus.deployment.dev.IsolatedDevModeMain.restartApp(IsolatedDevModeMain.java:198)
    at io.quarkus.deployment.dev.IsolatedDevModeMain.restartCallback(IsolatedDevModeMain.java:179)
    at io.quarkus.deployment.dev.RuntimeUpdatesProcessor.doScan(RuntimeUpdatesProcessor.java:541)
    at io.quarkus.deployment.console.ConsoleStateManager.forceRestart(ConsoleStateManager.java:168)
    at io.quarkus.deployment.console.ConsoleStateManager.lambda$installBuiltins$0(ConsoleStateManager.java:106)
    at io.quarkus.deployment.console.ConsoleStateManager$1.accept(ConsoleStateManager.java:77)
    at io.quarkus.deployment.console.ConsoleStateManager$1.accept(ConsoleStateManager.java:49)
    at io.quarkus.dev.console.BasicConsole$2.run(BasicConsole.java:83)
    at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: java.lang.RuntimeException: Failed to start quarkus
    at io.quarkus.runner.ApplicationImpl.doStart(Unknown Source)
    at io.quarkus.runtime.Application.start(Application.java:101)
    at io.quarkus.runtime.ApplicationLifecycleManager.run(ApplicationLifecycleManager.java:111)
    at io.quarkus.runtime.Quarkus.run(Quarkus.java:71)
    at io.quarkus.runtime.Quarkus.run(Quarkus.java:44)
    at io.quarkus.runtime.Quarkus.run(Quarkus.java:124)
    at io.quarkus.runner.GeneratedMain.main(Unknown Source)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:568)
    at io.quarkus.runner.bootstrap.StartupActionImpl$1.run(StartupActionImpl.java:104)
    ... 1 more
Caused by: jakarta.enterprise.inject.CreationException: Error creating synthetic bean [88c30b16cff11db6853fdfa2bda9cc5278d6a51a]: jakarta.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint 'jakarta.validation.constraints.Email' validating type 'java.lang.String'. Check configuration for 'notificationEmails.<return value>[].<iterable element>'
    at com.zucchetti.mercurio.config.SuiteConfig_88c30b16cff11db6853fdfa2bda9cc5278d6a51a_Synthetic_Bean.doCreate(Unknown Source)
    at com.zucchetti.mercurio.config.SuiteConfig_88c30b16cff11db6853fdfa2bda9cc5278d6a51a_Synthetic_Bean.create(Unknown Source)
    at com.zucchetti.mercurio.config.SuiteConfig_88c30b16cff11db6853fdfa2bda9cc5278d6a51a_Synthetic_Bean.get(Unknown Source)
    at com.zucchetti.mercurio.config.SuiteConfig_88c30b16cff11db6853fdfa2bda9cc5278d6a51a_Synthetic_Bean.get(Unknown Source)
    at io.quarkus.arc.impl.CurrentInjectionPointProvider.get(CurrentInjectionPointProvider.java:48)
    at com.zucchetti.mercurio.upload.queue.UploadQueueProcessorBean_Bean.doCreate(Unknown Source)
    at com.zucchetti.mercurio.upload.queue.UploadQueueProcessorBean_Bean.create(Unknown Source)
    at com.zucchetti.mercurio.upload.queue.UploadQueueProcessorBean_Bean.create(Unknown Source)
    at io.quarkus.arc.impl.AbstractSharedContext.createInstanceHandle(AbstractSharedContext.java:113)
    at io.quarkus.arc.impl.AbstractSharedContext$1.get(AbstractSharedContext.java:37)
    at io.quarkus.arc.impl.AbstractSharedContext$1.get(AbstractSharedContext.java:34)
    at io.quarkus.arc.impl.LazyValue.get(LazyValue.java:26)
    at io.quarkus.arc.impl.ComputingCache.computeIfAbsent(ComputingCache.java:69)
    at io.quarkus.arc.impl.AbstractSharedContext.get(AbstractSharedContext.java:34)
    at com.zucchetti.mercurio.upload.queue.UploadQueueProcessorBean_Observer_start_d14ce62f0cafea9f9b9f12d19f3591f438ca8de3.notify(Unknown Source)
    at io.quarkus.arc.impl.EventImpl$Notifier.notifyObservers(EventImpl.java:346)
    at io.quarkus.arc.impl.EventImpl$Notifier.notify(EventImpl.java:328)
    at io.quarkus.arc.impl.EventImpl.fire(EventImpl.java:82)
    at io.quarkus.arc.runtime.ArcRecorder.fireLifecycleEvent(ArcRecorder.java:155)
    at io.quarkus.arc.runtime.ArcRecorder.handleLifecycleEvents(ArcRecorder.java:106)
    at io.quarkus.deployment.steps.LifecycleEventsBuildStep$startupEvent1144526294.deploy_0(Unknown Source)
    at io.quarkus.deployment.steps.LifecycleEventsBuildStep$startupEvent1144526294.deploy(Unknown Source)
    ... 13 more
Caused by: jakarta.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint 'jakarta.validation.constraints.Email' validating type 'java.lang.String'. Check configuration for 'notificationEmails.<return value>[].<iterable element>'
    at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.getExceptionForNullValidator(ConstraintTree.java:116)
    at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.getInitializedConstraintValidator(ConstraintTree.java:162)
    at org.hibernate.validator.internal.engine.constraintvalidation.SimpleConstraintTree.validateConstraints(SimpleConstraintTree.java:58)
    at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateConstraints(ConstraintTree.java:75)
    at org.hibernate.validator.internal.metadata.core.MetaConstraint.doValidateConstraint(MetaConstraint.java:130)
    at org.hibernate.validator.internal.metadata.core.MetaConstraint$TypeParameterValueReceiver.doValidate(MetaConstraint.java:246)
    at org.hibernate.validator.internal.metadata.core.MetaConstraint$TypeParameterValueReceiver.iterableValue(MetaConstraint.java:206)
    at org.hibernate.validator.internal.engine.valueextraction.IterableValueExtractor.extractValues(IterableValueExtractor.java:27)
    at org.hibernate.validator.internal.engine.valueextraction.IterableValueExtractor.extractValues(IterableValueExtractor.java:16)
    at org.hibernate.validator.internal.engine.valueextraction.ValueExtractorHelper.extractValues(ValueExtractorHelper.java:42)
    at org.hibernate.validator.internal.metadata.core.MetaConstraint.validateConstraint(MetaConstraint.java:117)
    at org.hibernate.validator.internal.engine.ValidatorImpl.validateMetaConstraint(ValidatorImpl.java:555)
    at org.hibernate.validator.internal.engine.ValidatorImpl.validateMetaConstraints(ValidatorImpl.java:537)
    at org.hibernate.validator.internal.engine.ValidatorImpl.validateReturnValueForSingleGroup(ValidatorImpl.java:1141)
    at org.hibernate.validator.internal.engine.ValidatorImpl.validateReturnValueForGroup(ValidatorImpl.java:1111)
    at org.hibernate.validator.internal.engine.ValidatorImpl.validateReturnValueInContext(ValidatorImpl.java:1033)
    at org.hibernate.validator.internal.engine.ValidatorImpl.validateReturnValue(ValidatorImpl.java:309)
    at org.hibernate.validator.internal.engine.ValidatorImpl.validateReturnValue(ValidatorImpl.java:259)
    at io.smallrye.config.validator.BeanValidationConfigValidator.validatePropertyValue(BeanValidationConfigValidator.java:222)
    at io.smallrye.config.validator.BeanValidationConfigValidator.validateProperty(BeanValidationConfigValidator.java:146)
    at io.smallrye.config.validator.BeanValidationConfigValidator.validateMappingInterface(BeanValidationConfigValidator.java:64)
    at io.smallrye.config.validator.BeanValidationConfigValidator.validateMapping(BeanValidationConfigValidator.java:40)
    at io.smallrye.config.ConfigMappings.getConfigMapping(ConfigMappings.java:124)
    at io.smallrye.config.SmallRyeConfig.getConfigMapping(SmallRyeConfig.java:411)
    at io.quarkus.arc.runtime.ConfigMappingCreator.create(ConfigMappingCreator.java:30)
    at com.zucchetti.mercurio.config.SuiteConfig_88c30b16cff11db6853fdfa2bda9cc5278d6a51a_Synthetic_Bean.createSynthetic(Unknown Source)

The same validation placed on field in @Entity works as expected.

@Entity
public class Customer extends PanacheEntityBase {
  Set<@NotNull @Email String> notificationEmails;
}

Any advice? Best regards Luca Basso Ricci

Originally posted by @luca-bassoricci in https://github.com/quarkusio/quarkus/discussions/35075

luca-bassoricci commented 1 year ago

Reproducer: https://github.com/luca-bassoricci/issue-35081

gsmet commented 1 year ago

@luca-bassoricci I had a look at your reproducer and I was able to start the project:

2023-07-28 15:27:40,027 INFO  [io.quarkus] (Quarkus Main Thread) issue-35081 1.0.0-SNAPSHOT on JVM (powered by Quarkus 3.2.2.Final) started in 0.601s. 

Is there something wrong in the reproducer?

gsmet commented 1 year ago

(I cloned your project and started it in dev mode with mvn quarkus:dev)

luca-bassoricci commented 1 year ago

sorry @gsmet I forgot to wrote down to run "mvn test"

gsmet commented 1 year ago

Ah, perfect, thanks, I can reproduce it now.

gsmet commented 1 year ago

Thanks a lot for the easy reproducer!

Fix coming in this PR: https://github.com/quarkusio/quarkus/pull/35087

gsmet commented 1 year ago

The fix is going into 3.2.3.Final that is going to be released next week.