Skip to content

Gradle task processAot fails when Bean Validation API present but no provider found #30130

Closed
@abelsromero

Description

@abelsromero

We have a native application pulling jakarta.validation:jakarta.validation-api as a transitive dependency but not using Validation.
And the following failure appears during processAot task for Spring Boot 3.0.3 and 3.0.4, but not 3.0.2

~/...//spring-cloud-gateway-k8s >>> ./gradlew :scg-operator:processAot                                                                                                                                                                                                   

> Task :scg-operator:processAot
2023-03-16T10:54:24.913+01:00  INFO 99554 --- [           main] c.v.t.s.OperatorApplication              : Starting OperatorApplication using Java 17.0.6 with PID 99554 (/Users////spring-cloud-gateway-k8s/scg-operator/build/classes/java/main started by in /Users//work/code/spring-cloud-gateway-k8s/scg-operator)
Exception in thread "main" java.lang.ExceptionInInitializerErrorc.v.t.s.OperatorApplication              : No active profile set, falling back to 1 default profile: "default"
        at org.springframework.validation.beanvalidation.BeanValidationBeanRegistrationAotProcessor.processAheadOfTime(BeanValidationBeanRegistrationAotProcessor.java:59)
        at org.springframework.beans.factory.aot.BeanDefinitionMethodGeneratorFactory.getAotContributions(BeanDefinitionMethodGeneratorFactory.java:151)
        at org.springframework.beans.factory.aot.BeanDefinitionMethodGeneratorFactory.getBeanDefinitionMethodGenerator(BeanDefinitionMethodGeneratorFactory.java:99)
        at org.springframework.beans.factory.aot.BeanDefinitionMethodGeneratorFactory.getBeanDefinitionMethodGenerator(BeanDefinitionMethodGeneratorFactory.java:115)
        at org.springframework.beans.factory.aot.BeanRegistrationsAotProcessor.processAheadOfTime(BeanRegistrationsAotProcessor.java:48)
        at org.springframework.beans.factory.aot.BeanRegistrationsAotProcessor.processAheadOfTime(BeanRegistrationsAotProcessor.java:36)
        at org.springframework.context.aot.BeanFactoryInitializationAotContributions.getContributions(BeanFactoryInitializationAotContributions.java:67)
        at org.springframework.context.aot.BeanFactoryInitializationAotContributions.<init>(BeanFactoryInitializationAotContributions.java:49)
        at org.springframework.context.aot.BeanFactoryInitializationAotContributions.<init>(BeanFactoryInitializationAotContributions.java:44)
        at org.springframework.context.aot.ApplicationContextAotGenerator.lambda$processAheadOfTime$0(ApplicationContextAotGenerator.java:58)
        at org.springframework.context.aot.ApplicationContextAotGenerator.withCglibClassHandler(ApplicationContextAotGenerator.java:67)
        at org.springframework.context.aot.ApplicationContextAotGenerator.processAheadOfTime(ApplicationContextAotGenerator.java:53)
        at org.springframework.context.aot.ContextAotProcessor.performAotProcessing(ContextAotProcessor.java:106)
        at org.springframework.context.aot.ContextAotProcessor.doProcess(ContextAotProcessor.java:84)
        at org.springframework.context.aot.ContextAotProcessor.doProcess(ContextAotProcessor.java:49)
        at org.springframework.context.aot.AbstractAotProcessor.process(AbstractAotProcessor.java:82)
        at org.springframework.boot.SpringApplicationAotProcessor.main(SpringApplicationAotProcessor.java:80)
Caused by: jakarta.validation.NoProviderFoundException: Unable to create a Configuration, because no Jakarta Bean Validation provider could be found. Add a provider like Hibernate Validator (RI) to your classpath.
        at jakarta.validation.Validation$GenericBootstrapImpl.configure(Validation.java:291)
        at jakarta.validation.Validation.buildDefaultValidatorFactory(Validation.java:103)
        at org.springframework.validation.beanvalidation.BeanValidationBeanRegistrationAotProcessor$BeanValidationDelegate.<clinit>(BeanValidationBeanRegistrationAotProcessor.java:66)
        ... 17 more

It seems BeanValidationBeanRegistrationAotProcessor is too strict and while having the API without implementation is not useful I don't think is a common case when dealing with third-party dependencies (in this case io.swagger.core.v3:swagger-core).

Current workarounds:

  1. Excluding exclude (group: 'jakarta.validation', module: 'jakarta.validation-api') completely
  2. Adding implementation 'org.springframework.boot:spring-boot-starter-validation'

Metadata

Metadata

Assignees

Labels

in: coreIssues in core modules (aop, beans, core, context, expression)theme: aotAn issue related to Ahead-of-time processingtype: regressionA bug that is also a regression

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions