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

Most upvoted comments

@Sitzilla I’ll take care of fixing the build failures in that PR soon (amidst other priorities). Stay tuned.

@Sitzilla Thanks for posting!

I’ll look into this issue.