okta-sdk-java: Unable to use with Spring Boot 3
Describe the bug?
My team is upgrading from Spring Boot 2.7.7 to Spring Boot 3.0.2. We are getting an error when trying to instantiate the new ApiClient as described in the migration guide here.
What is expected to happen?
We expect the service to start without error, and able to build an ApiClient.
What is the actual behavior?
Failing with the following error:
Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.
2023-02-27T14:22:37.042-08:00 ERROR 28792 --- [ main] o.s.boot.SpringApplication : Application run failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'createOktaUserApi' defined in class path resource [com/mytestproject/testoktaintegration/OktaConfiguration.class]: Failed to instantiate [org.openapitools.client.api.UserApi]: Factory method 'createOktaUserApi' threw exception with message: org/apache/hc/client5/http/classic/HttpClient
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:657) ~[spring-beans-6.0.4.jar:6.0.4]
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:491) ~[spring-beans-6.0.4.jar:6.0.4]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1324) ~[spring-beans-6.0.4.jar:6.0.4]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1161) ~[spring-beans-6.0.4.jar:6.0.4]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:561) ~[spring-beans-6.0.4.jar:6.0.4]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:521) ~[spring-beans-6.0.4.jar:6.0.4]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326) ~[spring-beans-6.0.4.jar:6.0.4]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-6.0.4.jar:6.0.4]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324) ~[spring-beans-6.0.4.jar:6.0.4]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) ~[spring-beans-6.0.4.jar:6.0.4]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:961) ~[spring-beans-6.0.4.jar:6.0.4]
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:915) ~[spring-context-6.0.4.jar:6.0.4]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:584) ~[spring-context-6.0.4.jar:6.0.4]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.0.2.jar:3.0.2]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:730) ~[spring-boot-3.0.2.jar:3.0.2]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:432) ~[spring-boot-3.0.2.jar:3.0.2]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:308) ~[spring-boot-3.0.2.jar:3.0.2]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1302) ~[spring-boot-3.0.2.jar:3.0.2]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1291) ~[spring-boot-3.0.2.jar:3.0.2]
at com.mytestproject.testoktaintegration.TestOktaIntegrationApplication.main(TestOktaIntegrationApplication.java:10) ~[main/:na]
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.openapitools.client.api.UserApi]: Factory method 'createOktaUserApi' threw exception with message: org/apache/hc/client5/http/classic/HttpClient
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:171) ~[spring-beans-6.0.4.jar:6.0.4]
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653) ~[spring-beans-6.0.4.jar:6.0.4]
... 19 common frames omitted
Caused by: java.lang.NoClassDefFoundError: org/apache/hc/client5/http/classic/HttpClient
at com.okta.sdk.impl.client.DefaultClientBuilder.requestFactory(DefaultClientBuilder.java:453) ~[okta-sdk-impl-10.2.0.jar:10.2.0]
at com.okta.sdk.impl.client.DefaultClientBuilder.restTemplate(DefaultClientBuilder.java:430) ~[okta-sdk-impl-10.2.0.jar:10.2.0]
at com.okta.sdk.impl.client.DefaultClientBuilder.build(DefaultClientBuilder.java:352) ~[okta-sdk-impl-10.2.0.jar:10.2.0]
at com.mytestproject.testoktaintegration.OktaConfiguration.createOktaApiClient(OktaConfiguration.java:23) ~[main/:na]
at com.mytestproject.testoktaintegration.OktaConfiguration.createOktaUserApi(OktaConfiguration.java:16) ~[main/:na]
at com.mytestproject.testoktaintegration.OktaConfiguration$$SpringCGLIB$$0.CGLIB$createOktaUserApi$1(<generated>) ~[main/:na]
at com.mytestproject.testoktaintegration.OktaConfiguration$$SpringCGLIB$$2.invoke(<generated>) ~[main/:na]
at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:258) ~[spring-core-6.0.4.jar:6.0.4]
at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:331) ~[spring-context-6.0.4.jar:6.0.4]
at com.mytestproject.testoktaintegration.OktaConfiguration$$SpringCGLIB$$0.createOktaUserApi(<generated>) ~[main/:na]
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.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:139) ~[spring-beans-6.0.4.jar:6.0.4]
... 20 common frames omitted
Caused by: java.lang.ClassNotFoundException: org.apache.hc.client5.http.classic.HttpClient
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) ~[na:na]
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) ~[na:na]
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520) ~[na:na]
... 35 common frames omitted
Process finished with exit code 1
Reproduction Steps?
I generated a new Spring Boot project from Spring Initializer, added the spring-boot-web-starter dependency, then added in the two dependencies okta-sdk-api and okta-sdk-impl per the README.
Gradle Dependencies:
plugins {
id 'java'
id 'org.springframework.boot' version '3.0.2'
id 'io.spring.dependency-management' version '1.1.0'
}
group = 'com.mytestproject'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation "com.okta.sdk:okta-sdk-api:10.2.0"
runtimeOnly "com.okta.sdk:okta-sdk-impl:10.2.0"
}
Okta Bean Configurations
@Configuration
public class OktaConfiguration {
@Bean
public UserApi createOktaUserApi() {
return new UserApi(createOktaApiClient());
}
public ApiClient createOktaApiClient() {
return Clients.builder()
.setOrgUrl("MY_ORG_URL")
.setClientCredentials(new TokenClientCredentials("MY_TOKEN"))
.build();
}
}
Application
@SpringBootApplication
public class TestOktaIntegrationApplication {
public static void main(String[] args) {
SpringApplication.run(TestOktaIntegrationApplication.class, args);
}
}
Additional Information?
No response
Java Version
➜ java --version
openjdk 17.0.4.1 2022-08-12 LTS
OpenJDK Runtime Environment Corretto-17.0.4.9.1 (build 17.0.4.1+9-LTS)
OpenJDK 64-Bit Server VM Corretto-17.0.4.9.1 (build 17.0.4.1+9-LTS, mixed mode, sharing)
SDK Version
10.2.0
OS version
❯ uname -a
Darwin ML-HWQ6FQ9XLN 21.6.0 Darwin Kernel Version 21.6.0: Sun Nov 6 23:31:13 PST 2022; root:xnu-8020.240.14~1/RELEASE_ARM64_T6000 arm64
About this issue
- Original URL
- State: closed
- Created a year ago
- Comments: 15 (10 by maintainers)
Commits related to this issue
- Test SDK codegen with OASv3 PR #826 — committed to okta/okta-sdk-java by arvindkrishnakumar-okta 4 months ago
@Sitzilla I’ll take care of fixing the build failures in that PR soon (amidst other priorities). Stay tuned.
Indeed, the fix should be released in https://github.com/OpenAPITools/openapi-generator/releases/tag/v6.3.0
@Sitzilla Thanks for posting!
I’ll look into this issue.