Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

jakarta.validation.NoProviderFoundException on application startup #1979

Closed
bjpe opened this issue Dec 2, 2022 · 5 comments
Closed

jakarta.validation.NoProviderFoundException on application startup #1979

bjpe opened this issue Dec 2, 2022 · 5 comments
Labels
invalid This doesn't seem right

Comments

@bjpe
Copy link

bjpe commented Dec 2, 2022

Describe the bug

I discovered that after an update of my application to Spring Boot 3.0.0 and Springdoc-Openapi 2, I get a jakarta.validation.NoProviderFoundException message as an information on application startup:

2022-12-02T13:52:30.220+01:00  INFO 26628 --- [           main] o.h.c.beanvalidation.TypeSafeActivator   : Error calling `jakarta.validation.Validation#buildDefaultValidatorFactory`

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) ~[jakarta.validation-api-3.0.2.jar:na]
	at jakarta.validation.Validation.buildDefaultValidatorFactory(Validation.java:103) ~[jakarta.validation-api-3.0.2.jar:na]
	at org.hibernate.cfg.beanvalidation.TypeSafeActivator.getValidatorFactory(TypeSafeActivator.java:479) ~[hibernate-core-6.1.5.Final.jar:6.1.5.Final]
	at org.hibernate.cfg.beanvalidation.TypeSafeActivator.activate(TypeSafeActivator.java:82) ~[hibernate-core-6.1.5.Final.jar:6.1.5.Final]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
	at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
	at org.hibernate.cfg.beanvalidation.BeanValidationIntegrator.integrate(BeanValidationIntegrator.java:137) ~[hibernate-core-6.1.5.Final.jar:6.1.5.Final]
	at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:285) ~[hibernate-core-6.1.5.Final.jar:6.1.5.Final]
	at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:415) ~[hibernate-core-6.1.5.Final.jar:6.1.5.Final]
	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1425) ~[hibernate-core-6.1.5.Final.jar:6.1.5.Final]
	at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:66) ~[spring-orm-6.0.2.jar:6.0.2]
	at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:376) ~[spring-orm-6.0.2.jar:6.0.2]
	at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) ~[spring-orm-6.0.2.jar:6.0.2]
	at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) ~[spring-orm-6.0.2.jar:6.0.2]
	at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:352) ~[spring-orm-6.0.2.jar:6.0.2]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1797) ~[spring-beans-6.0.2.jar:6.0.2]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1747) ~[spring-beans-6.0.2.jar:6.0.2]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:599) ~[spring-beans-6.0.2.jar:6.0.2]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:521) ~[spring-beans-6.0.2.jar:6.0.2]
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326) ~[spring-beans-6.0.2.jar:6.0.2]
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-6.0.2.jar:6.0.2]
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324) ~[spring-beans-6.0.2.jar:6.0.2]
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) ~[spring-beans-6.0.2.jar:6.0.2]
	at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1130) ~[spring-context-6.0.2.jar:6.0.2]
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:905) ~[spring-context-6.0.2.jar:6.0.2]
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:584) ~[spring-context-6.0.2.jar:6.0.2]
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.0.0.jar:3.0.0]
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:730) ~[spring-boot-3.0.0.jar:3.0.0]
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:432) ~[spring-boot-3.0.0.jar:3.0.0]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:308) ~[spring-boot-3.0.0.jar:3.0.0]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1302) ~[spring-boot-3.0.0.jar:3.0.0]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1291) ~[spring-boot-3.0.0.jar:3.0.0]
	at com.example.demo.DemoApplication.main(DemoApplication.java:10) ~[classes/:na]

To Reproduce

  1. Create a vanilla application on start.spring.io with
  • Spring Data JPA
  • Spring Web
  • Maven
  • Java 17
  1. Add H2 driver
  2. Add springdoc-openapi-starter-webmvc-ui
  3. Start the application

Please see https://github.com/bjpe/springdoc-openapi-1979 for an example project.

Expected behavior

No stacktrace is shown.

Additional context

The error no longer occurs if I add spring-boot-starter-validation as well.

@bnasslahsen
Copy link
Contributor

@bjpe,

see your stacktrace.
Nothing related to springdoc-openapi...

@bnasslahsen bnasslahsen added the invalid This doesn't seem right label Dec 2, 2022
@bjpe
Copy link
Author

bjpe commented Dec 2, 2022

Hi @bnasslahsen , I understand that the stack trace does not lead to springdoc, but the error occurs just after I added the dependency to springdoc-openapi-starter-webmvc-ui. (and vanished if I remove the dependency). Do you have an idea what the root cause could be?

@bnasslahsen
Copy link
Contributor

bnasslahsen commented Dec 2, 2022

@bjpe,

In your stacktrace, it's hibernate 6 that logs/needs it.

@bjpe
Copy link
Author

bjpe commented Dec 2, 2022

Hi @bnasslahsen , I had a deeped look at this and finally found the root cause:

  • jakarta.validation:jakarta.validation-api:3.0.2 comes as a transitive dependency of org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.0
  • In Hibernate 6.1.5, org.hibernate.cfg.beanvalidation.BeanValidationIntegrator#isBeanValidationApiAvailable looks for the validation API on the classpath
  • If the API can be found on the classpath, then org.hibernate.cfg.beanvalidation.BeanValidationIntegrator#integrate tries to find a validation provider.

Thus, when working with Spring Data JPA and Springdoc, the issue will occur as long as no validation provider is present, which also explains why adding spring-boot-starter-validation solves the problem as well.

For the record: The transitive dependency chain is:

demo
> org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.0
> org.springdoc:springdoc-openapi-starter-webmvc-api:2.0.0
> org.springdoc:springdoc-openapi-starter-common:2.0.0
> io.swagger.core.v3:swagger-core-jakarta:2.2.7
> jakarta.validation:jakarta.validation-api:3.0.2

@bnasslahsen
Copy link
Contributor

@bjpe,

Good that you understood the cause!
Just follow the hint in the stacktrace you got from the hibernate api!

@springdoc springdoc locked as too heated and limited conversation to collaborators Dec 2, 2022
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
invalid This doesn't seem right
Projects
None yet
Development

No branches or pull requests

2 participants