spring-boot icon indicating copy to clipboard operation
spring-boot copied to clipboard

Spring 3.5.0 app doesnt start sometimes (@ConditionalOnMissingBean not considered)

Open Nico-Strecker opened this issue 7 months ago • 2 comments

Hey, I have a similar problem with Springdoc and Resilience4j, @wilkinsona as #45709.

Springdoc:

@Bean
@Lazy(false)
SpringDocParameterNameDiscoverer localSpringDocParameterNameDiscoverer() {
    return new SpringDocParameterNameDiscoverer();
}

Resilience4j:

@Bean
@ConditionalOnMissingBean
public ParameterNameDiscoverer parameterNameDiscoverer() {
    return configuration.parameterNameDiscoverer();
}

The app deploys fine as a -in-development version in our development environment on cloud foundry. However, when pushing the same code to our release branch (only the version number in the pom.xml is changed — no -SNAPSHOT), the application fails with the following exception:

APPLICATION FAILED TO START
Description:

Parameter 1 of method spelResolver in io.github.resilience4j.springboot3.spelresolver.autoconfigure.SpelResolverConfigurationOnMissingBean required a single bean, but 2 were found:
- parameterNameDiscoverer: defined by method 'parameterNameDiscoverer' in class path resource [io/github/resilience4j/springboot3/spelresolver/autoconfigure/SpelResolverConfigurationOnMissingBean.class]
- localSpringDocParameterNameDiscoverer: defined by method 'localSpringDocParameterNameDiscoverer' in class path resource [org/springdoc/core/configuration/SpringDocConfiguration.class]
I would have expected that @ConditionalOnMissingBean is evaluated after all other beans are registered, so that parameterNameDiscoverer() from Resilience4j is only created if no other ParameterNameDiscoverer exists.
However, what seems to happen is that both beans are created.

Is there something I'm misunderstanding? This was never an issue in Spring Boot 3.4.6, but in 3.5.0 the behavior seems to have changed and my code is now unstable.

I can't directly control either library and will raise issues if needed for them, but in my opinion, they work together correctly. I just want to clarify this behavior first, might it be a spring boot 3.5.0 issue?

Nico-Strecker avatar Jun 12 '25 15:06 Nico-Strecker

For @ConditionalOnMissingBean to work in this case the configuration class that defines parameterNameDiscoverer must be parsed after the configuration class that defines localSpringDocParameterNameDiscoverer.

  • If they're both auto-configuration classes (or both imported by auto-configuration classes), that can be achieved using auto-configuration ordering. In the absence of any ordering, auto-configuration classes are ordered alphabetically. As such the ordering of two auto-configuration classes and everything they import should always be deterministic.
  • If one's a standard configuration class and the other's an auto-configuration class, the standard configuration class will always be parsed first.
  • If they're both user configuration classes found, for example, by component scanning, the ordering won't be well defined and you may see problems like this.

There isn't enough context in this issue to tell which of these three options applies here. My guess would be that the code has always been potentially unstable and something else has shaken loose a long-standing bug.

If you can share a minimal sample that combines both Resilience4j and SpringDoc way may be able to identify where the potential instability is coming from.

wilkinsona avatar Jun 12 '25 16:06 wilkinsona

I will check that tomorrow and inform you and i try to set up a similar example but it just happens sometimes i dont know the exact reason either

Nico-Strecker avatar Jun 12 '25 18:06 Nico-Strecker

So some info about the classes:

Resilience4j

SpelResolverConfigurationOnMissingBean is part of the resilience4j BulkheadAutoConfiguration autoconfiguration (It imports BulkheadConfigurationOnMissingBean.class which extends AbstractBulheadConfigurationOnMissingBean which imports SpelResolverConfigurationOnMissingBean) so if i understand correctly since they are ordered alphabetically it is Bu for the importing autoconfig, the SpelResolverConfigurationOnMissingBean-Configuration that contains the parameterNameDiscoverer-method itself is not direclty an auto-configuration but referenced by one what causes the Alphabetical ordering

Correct me if i got this wrong so far.

Springdoc

The SpringDocConfiguration itself is part of the autoconfiguration. The class itself is annotated as following:

@Lazy(false)
@Configuration(proxyBeanMethods = false)
@ConditionalOnProperty(name = SPRINGDOC_ENABLED, matchIfMissing = true)
@ConditionalOnWebApplication

The localSpringDocParameterNameDiscoverer looks like that:

	@Bean
	@Lazy(false)
	SpringDocParameterNameDiscoverer localSpringDocParameterNameDiscoverer() {
		return new SpringDocParameterNameDiscoverer();
	}

In both deployments the ConditionalOnProperty was active:

Conclusion

Following the alphabetic rule the Resilience4j should always be created first because B comes before S. the second bean is created because it is not annotated as @ConditionalOnMissingBean

The question is why is the resilience4j only created sometimes.

Right now i wasnt able to create a mvp but i was short on time maby i get to set one up tomorrow but thats my current state of information.

Nico-Strecker avatar Jun 16 '25 13:06 Nico-Strecker

I logged the following in my application locally:

[Bean Init 149] Bean 'parameterNameDiscoverer' of type org.springframework.core.StandardReflectionParameterNameDiscoverer is initializing
[Bean Init 150] Bean 'spelResolver' of type io.github.resilience4j.spring6.spelresolver.DefaultSpelResolver is initializing
...
[Bean Init 606] Bean 'localSpringDocParameterNameDiscoverer' of type org.springdoc.core.discoverer.SpringDocParameterNameDiscoverer is initializing

When i run my application locally the same two beans are initialized but i dont get an exception this is also very interesting because the spelResolver is created right after the parameterNameDiscoverer but before the localSpringDocParameterNameDiscoverer.

Nico-Strecker avatar Jun 16 '25 14:06 Nico-Strecker

since they are ordered alphabetically

That's just a fallback if there's nothing else (@AutoConfigureBefore, @AutoConfigureAfter, etc) influencing the order.

When i run my application locally the same two beans are initialized but i dont get an exception

Thanks for the additional details. Initialization order isn't the problem here, it's definition order.

maby i get to set one up tomorrow

Please let us know if you do. I don't think there's anything we can do here without one.

wilkinsona avatar Jun 16 '25 16:06 wilkinsona

@wilkinsona i did not manage to create a mvp at the moment Could this be interesting because just starting the app 5000 times with res4j and springdoc enabled and implemented doesnt cause the issue but a bit earlier in the logs when it fails i see this:

Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'oneOfMyService' defined in file [/home/vcap/app/BOOT-INF/classes/de/myapppath/oneOfMyService.class]: Advisor sorting failed with unexpected bean creation, probably due to custom use of the Ordered interface. Consider using the @Order annotation instead.

The service itself does not implement any such interface.

While debugging i noticed there are 2 Advisors present (at least locally maby the appdynamicsagent in cloud foundry adds also something but i havent looked into that (thats the only difference i found between release and dev that could cause some strange behaviour))

The first advisor was present before extendAdvisors(...) was called. This advisor was the circuitBreakerArroundAdvice from resilience4j the second one was the org.springframework.aop.interceptor.ExposeInvocationInterceptor.ADVISOR

Nico-Strecker avatar Jun 16 '25 18:06 Nico-Strecker

Hey i know you want a MVP but i cant get one working even when starting the app with the java agents locally with same configs.

But i am now able to debug the startup on the cloud foundry is there anything where i can set a breakpoint and print out some order or something that would be interesting?

@bclozel @wilkinsona

Nico-Strecker avatar Jun 17 '25 22:06 Nico-Strecker

The values returned from org.springframework.boot.autoconfigure.AutoConfigurationSorter.getInPriorityOrder(Collection<String>) could be interesting.

wilkinsona avatar Jun 18 '25 06:06 wilkinsona

Short update we had a "longer weekend" in germany. I will now check the getInPriorityOrder (y)

Nico-Strecker avatar Jun 23 '25 09:06 Nico-Strecker

AlphabeticallyOrdered

So when alphabetically ordered the order in the list is: 5 - 18 = io.github.resilience4j... Where the BulkheadAutoConfiguration is on position 5 in the list (the BulkheadAutoCofig was the one that imports the SpelResolverConfigurationOnMissingBean-Configuration that contains the parameterNameDiscoverer)

20 - 38 = org.springdoc... Where the SpringDocConfiguration is on position 20 in the list (the one that contains the localSpringDocParameterNameDiscoverer)

After OrderedClassNames.sort

13 - 26 = io.github.resilience4j... Where the BulkheadAutoConfiguration is on position 13 in the list

28 - 46 = org.springdoc... Where the SpringDocConfiguration is on position 28 in the list (the one that contains the localSpringDocParameterNameDiscoverer)

Complete List [org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration, org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration, org.springframework.boot.autoconfigure.web.reactive.ReactiveWebServerFactoryAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration, org.springframework.boot.autoconfigure.web.reactive.HttpHandlerAutoConfiguration, org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration, de.da***.clou***************.ap********.AppLibraryAutoConfiguration, de.da***.clou***************.ap********.config.CacheConfig, de.da***.clou***************.ap********.config.WebClientConfig, de.da***.clou***************.appspringbootstarter.AppLibraryAutoConfiguration, de.da***.web************.spring.security.da***C*****Configuration, io.github.resilience4j.springboot3.bulkhead.autoconfigure.BulkheadAutoConfiguration, io.github.resilience4j.springboot3.bulkhead.autoconfigure.BulkheadMetricsAutoConfiguration, io.github.resilience4j.springboot3.bulkhead.autoconfigure.ThreadPoolBulkheadMetricsAutoConfiguration, io.github.resilience4j.springboot3.circuitbreaker.autoconfigure.CircuitBreakerAutoConfiguration, io.github.resilience4j.springboot3.circuitbreaker.autoconfigure.CircuitBreakerMetricsAutoConfiguration, io.github.resilience4j.springboot3.circuitbreaker.autoconfigure.CircuitBreakersHealthIndicatorAutoConfiguration, io.github.resilience4j.springboot3.ratelimiter.autoconfigure.RateLimiterAutoConfiguration, io.github.resilience4j.springboot3.ratelimiter.autoconfigure.RateLimiterMetricsAutoConfiguration, io.github.resilience4j.springboot3.ratelimiter.autoconfigure.RateLimitersHealthIndicatorAutoConfiguration, io.github.resilience4j.springboot3.retry.autoconfigure.RetryAutoConfiguration, io.github.resilience4j.springboot3.retry.autoconfigure.RetryMetricsAutoConfiguration, io.github.resilience4j.springboot3.scheduled.threadpool.autoconfigure.ContextAwareScheduledThreadPoolAutoConfiguration, io.github.resilience4j.springboot3.timelimiter.autoconfigure.TimeLimiterAutoConfiguration, io.github.resilience4j.springboot3.timelimiter.autoconfigure.TimeLimiterMetricsAutoConfiguration, org.cloudfoundry.router.jakarta.ClientCertificateMapperAutoConfiguration, org.springdoc.core.configuration.SpringDocConfiguration, org.springdoc.core.configuration.SpringDocDataRestConfiguration, org.springdoc.core.configuration.SpringDocFunctionCatalogConfiguration, org.springdoc.core.configuration.SpringDocGroovyConfiguration, org.springdoc.core.configuration.SpringDocHateoasConfiguration, org.springdoc.core.configuration.SpringDocJacksonKotlinModuleConfiguration, org.springdoc.core.configuration.SpringDocJavadocConfiguration, org.springdoc.core.configuration.SpringDocKotlinConfiguration, org.springdoc.core.configuration.SpringDocKotlinxConfiguration, org.springdoc.core.configuration.SpringDocPageableConfiguration, org.springdoc.core.configuration.SpringDocSecurityConfiguration, org.springdoc.core.configuration.SpringDocSortConfiguration, org.springdoc.core.configuration.SpringDocSpecPropertiesConfiguration, org.springdoc.core.properties.SpringDocConfigProperties, org.springdoc.core.properties.SwaggerUiConfigProperties, org.springdoc.core.properties.SwaggerUiOAuthProperties, org.springdoc.webmvc.core.configuration.MultipleOpenApiSupportConfiguration, org.springdoc.webmvc.core.configuration.SpringDocWebMvcConfiguration, org.springdoc.webmvc.ui.SwaggerConfig, org.springframework.boot.actuate.autoconfigure.audit.AuditAutoConfiguration, org.springframework.boot.actuate.autoconfigure.audit.AuditEventsEndpointAutoConfiguration, org.springframework.boot.actuate.autoconfigure.availability.AvailabilityHealthContributorAutoConfiguration, org.springframework.boot.actuate.autoconfigure.availability.AvailabilityProbesAutoConfiguration, org.springframework.boot.actuate.autoconfigure.beans.BeansEndpointAutoConfiguration, org.springframework.boot.actuate.autoconfigure.cache.CachesEndpointAutoConfiguration, org.springframework.boot.actuate.autoconfigure.cloudfoundry.reactive.ReactiveCloudFoundryActuatorAutoConfiguration, org.springframework.boot.actuate.autoconfigure.cloudfoundry.servlet.CloudFoundryActuatorAutoConfiguration, org.springframework.boot.actuate.autoconfigure.condition.ConditionsReportEndpointAutoConfiguration, org.springframework.boot.actuate.autoconfigure.context.ShutdownEndpointAutoConfiguration, org.springframework.boot.actuate.autoconfigure.context.properties.ConfigurationPropertiesReportEndpointAutoConfiguration, org.springframework.boot.actuate.autoconfigure.endpoint.EndpointAutoConfiguration, org.springframework.boot.actuate.autoconfigure.endpoint.jackson.JacksonEndpointAutoConfiguration, org.springframework.boot.actuate.autoconfigure.endpoint.jmx.JmxEndpointAutoConfiguration, org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointAutoConfiguration, org.springframework.boot.actuate.autoconfigure.env.EnvironmentEndpointAutoConfiguration, org.springframework.boot.actuate.autoconfigure.health.HealthContributorAutoConfiguration, org.springframework.boot.actuate.autoconfigure.health.HealthEndpointAutoConfiguration, org.springframework.boot.actuate.autoconfigure.info.InfoContributorAutoConfiguration, org.springframework.boot.actuate.autoconfigure.info.InfoEndpointAutoConfiguration, org.springframework.boot.actuate.autoconfigure.jdbc.DataSourceHealthContributorAutoConfiguration, org.springframework.boot.actuate.autoconfigure.ldap.LdapHealthContributorAutoConfiguration, org.springframework.boot.actuate.autoconfigure.liquibase.LiquibaseEndpointAutoConfiguration, org.springframework.boot.actuate.autoconfigure.logging.LogFileWebEndpointAutoConfiguration, org.springframework.boot.actuate.autoconfigure.logging.LoggersEndpointAutoConfiguration, org.springframework.boot.actuate.autoconfigure.mail.MailHealthContributorAutoConfiguration, org.springframework.boot.actuate.autoconfigure.management.HeapDumpWebEndpointAutoConfiguration, org.springframework.boot.actuate.autoconfigure.management.ThreadDumpEndpointAutoConfiguration, org.springframework.boot.actuate.autoconfigure.metrics.CompositeMeterRegistryAutoConfiguration, org.springframework.boot.actuate.autoconfigure.metrics.JvmMetricsAutoConfiguration, org.springframework.boot.actuate.autoconfigure.metrics.KafkaMetricsAutoConfiguration, org.springframework.boot.actuate.autoconfigure.metrics.LogbackMetricsAutoConfiguration, org.springframework.boot.actuate.autoconfigure.metrics.MetricsAspectsAutoConfiguration, org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration, org.springframework.boot.actuate.autoconfigure.metrics.MetricsEndpointAutoConfiguration, org.springframework.boot.actuate.autoconfigure.metrics.SystemMetricsAutoConfiguration, org.springframework.boot.actuate.autoconfigure.metrics.cache.CacheMetricsAutoConfiguration, org.springframework.boot.actuate.autoconfigure.metrics.data.RepositoryMetricsAutoConfiguration, org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration, org.springframework.boot.actuate.autoconfigure.metrics.integration.IntegrationMetricsAutoConfiguration, org.springframework.boot.actuate.autoconfigure.metrics.jdbc.DataSourcePoolMetricsAutoConfiguration, org.springframework.boot.actuate.autoconfigure.metrics.startup.StartupTimeMetricsListenerAutoConfiguration, org.springframework.boot.actuate.autoconfigure.metrics.task.TaskExecutorMetricsAutoConfiguration, org.springframework.boot.actuate.autoconfigure.metrics.web.tomcat.TomcatMetricsAutoConfiguration, org.springframework.boot.actuate.autoconfigure.observation.ObservationAutoConfiguration, org.springframework.boot.actuate.autoconfigure.observation.web.client.HttpClientObservationsAutoConfiguration, org.springframework.boot.actuate.autoconfigure.observation.web.reactive.WebFluxObservationAutoConfiguration, org.springframework.boot.actuate.autoconfigure.observation.web.servlet.WebMvcObservationAutoConfiguration, org.springframework.boot.actuate.autoconfigure.sbom.SbomEndpointAutoConfiguration, org.springframework.boot.actuate.autoconfigure.scheduling.ScheduledTasksEndpointAutoConfiguration, org.springframework.boot.actuate.autoconfigure.scheduling.ScheduledTasksObservabilityAutoConfiguration, org.springframework.boot.actuate.autoconfigure.security.reactive.ReactiveManagementWebSecurityAutoConfiguration, org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration, org.springframework.boot.actuate.autoconfigure.ssl.SslHealthContributorAutoConfiguration, org.springframework.boot.actuate.autoconfigure.ssl.SslObservabilityAutoConfiguration, org.springframework.boot.actuate.autoconfigure.startup.StartupEndpointAutoConfiguration, org.springframework.boot.actuate.autoconfigure.system.DiskSpaceHealthContributorAutoConfiguration, org.springframework.boot.actuate.autoconfigure.web.exchanges.HttpExchangesAutoConfiguration, org.springframework.boot.actuate.autoconfigure.web.exchanges.HttpExchangesEndpointAutoConfiguration, org.springframework.boot.actuate.autoconfigure.web.mappings.MappingsEndpointAutoConfiguration, org.springframework.boot.actuate.autoconfigure.web.reactive.ReactiveManagementContextAutoConfiguration, org.springframework.boot.actuate.autoconfigure.web.servlet.ServletManagementContextAutoConfiguration, org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration, org.springframework.boot.autoconfigure.aop.AopAutoConfiguration, org.springframework.boot.autoconfigure.availability.ApplicationAvailabilityAutoConfiguration, org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration, org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration, org.springframework.boot.autoconfigure.context.LifecycleAutoConfiguration, org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration, org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration, org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration, org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration, org.springframework.boot.autoconfigure.http.client.HttpClientAutoConfiguration, org.springframework.boot.autoconfigure.http.client.reactive.ClientHttpConnectorAutoConfiguration, org.springframework.boot.autoconfigure.http.codec.CodecsAutoConfiguration, org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration, org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.JdbcClientAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.JndiDataSourceAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.XADataSourceAutoConfiguration, org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration, org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration, org.springframework.boot.autoconfigure.ldap.LdapAutoConfiguration, org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration, org.springframework.boot.autoconfigure.mail.MailSenderValidatorAutoConfiguration, org.springframework.boot.autoconfigure.netty.NettyAutoConfiguration, org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration, org.springframework.boot.autoconfigure.reactor.ReactorAutoConfiguration, org.springframework.boot.autoconfigure.security.oauth2.resource.reactive.ReactiveOAuth2ResourceServerAutoConfiguration, org.springframework.boot.autoconfigure.security.reactive.ReactiveSecurityAutoConfiguration, org.springframework.boot.autoconfigure.security.reactive.ReactiveUserDetailsServiceAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration, org.springframework.boot.autoconfigure.sql.init.SqlInitializationAutoConfiguration, org.springframework.boot.autoconfigure.ssl.SslAutoConfiguration, org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration, org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration, org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration, org.springframework.boot.autoconfigure.transaction.TransactionManagerCustomizationAutoConfiguration, org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration, org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration, org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration, org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration, org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration, org.springframework.boot.autoconfigure.web.reactive.ReactiveMultipartAutoConfiguration, org.springframework.boot.autoconfigure.web.reactive.WebSessionIdResolverAutoConfiguration, org.springframework.boot.autoconfigure.web.reactive.error.ErrorWebFluxAutoConfiguration, org.springframework.boot.autoconfigure.web.reactive.function.client.ClientHttpConnectorAutoConfiguration, org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration, org.springframework.boot.autoconfigure.websocket.reactive.WebSocketReactiveAutoConfiguration, org.springframework.boot.autoconfigure.websocket.servlet.WebSocketServletAutoConfiguration, org.springframework.boot.actuate.autoconfigure.web.server.ManagementContextAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration]

Final (after sortByAnnotation)

24 & 27 - 39 = io.github.resilience4j... Where the BulkheadAutoConfiguration is on position 24 in the list

41 - 59 = org.springdoc... Where the SpringDocConfiguration is on position 41 in the list (the one that contains the localSpringDocParameterNameDiscoverer)

Complete List [org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration, org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration, org.springframework.boot.autoconfigure.websocket.reactive.WebSocketReactiveAutoConfiguration, org.springframework.boot.autoconfigure.web.reactive.ReactiveWebServerFactoryAutoConfiguration, org.springframework.boot.autoconfigure.ssl.SslAutoConfiguration, org.springframework.boot.autoconfigure.websocket.servlet.WebSocketServletAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration, org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration, org.springframework.boot.autoconfigure.http.codec.CodecsAutoConfiguration, org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration, org.springframework.boot.autoconfigure.web.reactive.ReactiveMultipartAutoConfiguration, org.springframework.boot.autoconfigure.web.reactive.WebSessionIdResolverAutoConfiguration, org.springframework.boot.autoconfigure.web.reactive.error.ErrorWebFluxAutoConfiguration, org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfiguration, org.springframework.boot.autoconfigure.web.reactive.HttpHandlerAutoConfiguration, org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration, de.da***.clou***************.appc2ainfo.AppLibraryAutoConfiguration, de.da***.clou***************.appc2ainfo.config.CacheConfig, de.da***.clou***************.appc2ainfo.config.WebClientConfig, de.da***.clou***************.appspringbootstarter.AppLibraryAutoConfiguration, de.da***.web************.spring.security.da***C*****Configuration, io.github.resilience4j.springboot3.bulkhead.autoconfigure.BulkheadAutoConfiguration, org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration, org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration, io.github.resilience4j.springboot3.bulkhead.autoconfigure.BulkheadMetricsAutoConfiguration, io.github.resilience4j.springboot3.bulkhead.autoconfigure.ThreadPoolBulkheadMetricsAutoConfiguration, io.github.resilience4j.springboot3.circuitbreaker.autoconfigure.CircuitBreakerAutoConfiguration, io.github.resilience4j.springboot3.circuitbreaker.autoconfigure.CircuitBreakerMetricsAutoConfiguration, io.github.resilience4j.springboot3.circuitbreaker.autoconfigure.CircuitBreakersHealthIndicatorAutoConfiguration, io.github.resilience4j.springboot3.ratelimiter.autoconfigure.RateLimiterAutoConfiguration, io.github.resilience4j.springboot3.ratelimiter.autoconfigure.RateLimiterMetricsAutoConfiguration, io.github.resilience4j.springboot3.ratelimiter.autoconfigure.RateLimitersHealthIndicatorAutoConfiguration, io.github.resilience4j.springboot3.retry.autoconfigure.RetryAutoConfiguration, io.github.resilience4j.springboot3.retry.autoconfigure.RetryMetricsAutoConfiguration, io.github.resilience4j.springboot3.scheduled.threadpool.autoconfigure.ContextAwareScheduledThreadPoolAutoConfiguration, io.github.resilience4j.springboot3.timelimiter.autoconfigure.TimeLimiterAutoConfiguration, io.github.resilience4j.springboot3.timelimiter.autoconfigure.TimeLimiterMetricsAutoConfiguration, org.cloudfoundry.router.jakarta.ClientCertificateMapperAutoConfiguration, org.springdoc.core.configuration.SpringDocConfiguration, org.springdoc.core.configuration.SpringDocDataRestConfiguration, org.springdoc.core.configuration.SpringDocFunctionCatalogConfiguration, org.springdoc.core.configuration.SpringDocGroovyConfiguration, org.springdoc.core.configuration.SpringDocHateoasConfiguration, org.springdoc.core.configuration.SpringDocJacksonKotlinModuleConfiguration, org.springdoc.core.configuration.SpringDocJavadocConfiguration, org.springdoc.core.configuration.SpringDocKotlinConfiguration, org.springdoc.core.configuration.SpringDocKotlinxConfiguration, org.springdoc.core.configuration.SpringDocPageableConfiguration, org.springdoc.core.configuration.SpringDocSecurityConfiguration, org.springdoc.core.configuration.SpringDocSortConfiguration, org.springdoc.core.configuration.SpringDocSpecPropertiesConfiguration, org.springdoc.core.properties.SpringDocConfigProperties, org.springdoc.core.properties.SwaggerUiConfigProperties, org.springdoc.core.properties.SwaggerUiOAuthProperties, org.springdoc.webmvc.core.configuration.MultipleOpenApiSupportConfiguration, org.springdoc.webmvc.core.configuration.SpringDocWebMvcConfiguration, org.springdoc.webmvc.ui.SwaggerConfig, org.springframework.boot.actuate.autoconfigure.audit.AuditAutoConfiguration, org.springframework.boot.actuate.autoconfigure.audit.AuditEventsEndpointAutoConfiguration, org.springframework.boot.autoconfigure.availability.ApplicationAvailabilityAutoConfiguration, org.springframework.boot.actuate.autoconfigure.availability.AvailabilityHealthContributorAutoConfiguration, org.springframework.boot.actuate.autoconfigure.availability.AvailabilityProbesAutoConfiguration, org.springframework.boot.actuate.autoconfigure.beans.BeansEndpointAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.JndiDataSourceAutoConfiguration, org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.XADataSourceAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration, org.springframework.boot.autoconfigure.transaction.TransactionManagerCustomizationAutoConfiguration, org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration, org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration, org.springframework.boot.actuate.autoconfigure.cache.CachesEndpointAutoConfiguration, org.springframework.boot.actuate.autoconfigure.health.HealthEndpointAutoConfiguration, org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration, org.springframework.boot.actuate.autoconfigure.info.InfoContributorAutoConfiguration, org.springframework.boot.actuate.autoconfigure.info.InfoEndpointAutoConfiguration, org.springframework.boot.actuate.autoconfigure.cloudfoundry.reactive.ReactiveCloudFoundryActuatorAutoConfiguration, org.springframework.boot.actuate.autoconfigure.web.servlet.ServletManagementContextAutoConfiguration, org.springframework.boot.actuate.autoconfigure.cloudfoundry.servlet.CloudFoundryActuatorAutoConfiguration, org.springframework.boot.actuate.autoconfigure.condition.ConditionsReportEndpointAutoConfiguration, org.springframework.boot.actuate.autoconfigure.context.ShutdownEndpointAutoConfiguration, org.springframework.boot.actuate.autoconfigure.context.properties.ConfigurationPropertiesReportEndpointAutoConfiguration, org.springframework.boot.actuate.autoconfigure.endpoint.EndpointAutoConfiguration, org.springframework.boot.actuate.autoconfigure.endpoint.jackson.JacksonEndpointAutoConfiguration, org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration, org.springframework.boot.actuate.autoconfigure.endpoint.jmx.JmxEndpointAutoConfiguration, org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointAutoConfiguration, org.springframework.boot.actuate.autoconfigure.env.EnvironmentEndpointAutoConfiguration, org.springframework.boot.actuate.autoconfigure.ssl.SslHealthContributorAutoConfiguration, org.springframework.boot.actuate.autoconfigure.system.DiskSpaceHealthContributorAutoConfiguration, org.springframework.boot.actuate.autoconfigure.health.HealthContributorAutoConfiguration, org.springframework.boot.actuate.autoconfigure.jdbc.DataSourceHealthContributorAutoConfiguration, org.springframework.boot.autoconfigure.ldap.LdapAutoConfiguration, org.springframework.boot.actuate.autoconfigure.ldap.LdapHealthContributorAutoConfiguration, org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration, org.springframework.boot.actuate.autoconfigure.liquibase.LiquibaseEndpointAutoConfiguration, org.springframework.boot.actuate.autoconfigure.logging.LogFileWebEndpointAutoConfiguration, org.springframework.boot.actuate.autoconfigure.logging.LoggersEndpointAutoConfiguration, org.springframework.boot.actuate.autoconfigure.mail.MailHealthContributorAutoConfiguration, org.springframework.boot.actuate.autoconfigure.management.HeapDumpWebEndpointAutoConfiguration, org.springframework.boot.actuate.autoconfigure.management.ThreadDumpEndpointAutoConfiguration, org.springframework.boot.actuate.autoconfigure.metrics.CompositeMeterRegistryAutoConfiguration, org.springframework.boot.actuate.autoconfigure.metrics.JvmMetricsAutoConfiguration, org.springframework.boot.actuate.autoconfigure.metrics.KafkaMetricsAutoConfiguration, org.springframework.boot.actuate.autoconfigure.metrics.LogbackMetricsAutoConfiguration, org.springframework.boot.actuate.autoconfigure.metrics.MetricsAspectsAutoConfiguration, org.springframework.boot.actuate.autoconfigure.metrics.MetricsEndpointAutoConfiguration, org.springframework.boot.actuate.autoconfigure.metrics.SystemMetricsAutoConfiguration, org.springframework.boot.actuate.autoconfigure.metrics.cache.CacheMetricsAutoConfiguration, org.springframework.boot.actuate.autoconfigure.metrics.data.RepositoryMetricsAutoConfiguration, org.springframework.boot.actuate.autoconfigure.metrics.integration.IntegrationMetricsAutoConfiguration, org.springframework.boot.actuate.autoconfigure.metrics.jdbc.DataSourcePoolMetricsAutoConfiguration, org.springframework.boot.actuate.autoconfigure.metrics.startup.StartupTimeMetricsListenerAutoConfiguration, org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration, org.springframework.boot.actuate.autoconfigure.metrics.task.TaskExecutorMetricsAutoConfiguration, org.springframework.boot.actuate.autoconfigure.metrics.web.tomcat.TomcatMetricsAutoConfiguration, org.springframework.boot.actuate.autoconfigure.observation.ObservationAutoConfiguration, org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration, org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration, org.springframework.boot.autoconfigure.http.client.HttpClientAutoConfiguration, org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration, org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration, org.springframework.boot.autoconfigure.http.client.reactive.ClientHttpConnectorAutoConfiguration, org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration, org.springframework.boot.actuate.autoconfigure.observation.web.client.HttpClientObservationsAutoConfiguration, org.springframework.boot.actuate.autoconfigure.observation.web.reactive.WebFluxObservationAutoConfiguration, org.springframework.boot.actuate.autoconfigure.observation.web.servlet.WebMvcObservationAutoConfiguration, org.springframework.boot.actuate.autoconfigure.sbom.SbomEndpointAutoConfiguration, org.springframework.boot.actuate.autoconfigure.scheduling.ScheduledTasksEndpointAutoConfiguration, org.springframework.boot.actuate.autoconfigure.scheduling.ScheduledTasksObservabilityAutoConfiguration, org.springframework.boot.autoconfigure.security.oauth2.resource.reactive.ReactiveOAuth2ResourceServerAutoConfiguration, org.springframework.boot.autoconfigure.security.reactive.ReactiveUserDetailsServiceAutoConfiguration, org.springframework.boot.actuate.autoconfigure.security.reactive.ReactiveManagementWebSecurityAutoConfiguration, org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration, org.springframework.boot.actuate.autoconfigure.ssl.SslObservabilityAutoConfiguration, org.springframework.boot.actuate.autoconfigure.startup.StartupEndpointAutoConfiguration, org.springframework.boot.actuate.autoconfigure.web.exchanges.HttpExchangesAutoConfiguration, org.springframework.boot.actuate.autoconfigure.web.exchanges.HttpExchangesEndpointAutoConfiguration, org.springframework.boot.actuate.autoconfigure.web.mappings.MappingsEndpointAutoConfiguration, org.springframework.boot.actuate.autoconfigure.web.reactive.ReactiveManagementContextAutoConfiguration, org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration, org.springframework.boot.autoconfigure.aop.AopAutoConfiguration, org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration, org.springframework.boot.autoconfigure.context.LifecycleAutoConfiguration, org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration, org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration, org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.JdbcClientAutoConfiguration, org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration, org.springframework.boot.autoconfigure.mail.MailSenderValidatorAutoConfiguration, org.springframework.boot.autoconfigure.netty.NettyAutoConfiguration, org.springframework.boot.autoconfigure.reactor.ReactorAutoConfiguration, org.springframework.boot.autoconfigure.security.reactive.ReactiveSecurityAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration, org.springframework.boot.autoconfigure.sql.init.SqlInitializationAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration, org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration, org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration, org.springframework.boot.autoconfigure.web.reactive.function.client.ClientHttpConnectorAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration, org.springframework.boot.actuate.autoconfigure.web.server.ManagementContextAutoConfiguration]

Nico-Strecker avatar Jun 23 '25 10:06 Nico-Strecker

I noticed we have the same issue with another app having springdoc and res4j they run in a very simliar environment but the new app is way smaller than the other one maby that makes it easier to debug or reproduce

Nico-Strecker avatar Jun 23 '25 12:06 Nico-Strecker

With the other app it also failed locally i now try to get it to fail even if i dont use the appdynamics agent because i get it to run locally too

Nico-Strecker avatar Jun 23 '25 16:06 Nico-Strecker

I will try out some more runs but the issue seems only to happen with appdynamics javaagent so i will forward the issue to them thank you for all your time and support 💚

Nico-Strecker avatar Jun 23 '25 17:06 Nico-Strecker

I am also facing same issue on my app. My app also has both res4j and spring doc library. It works in local and one environment but fails in another environment. I am using spring boot version 3.5.2 version. Could you please help on how can we fix it?

BCS-ChaitaliS avatar Jul 15 '25 13:07 BCS-ChaitaliS

I am also facing same issue on my app. My app also has both res4j and spring doc library. It works in local and one environment but fails in another environment. I am using spring boot version 3.5.2 version. Could you please help on how can we fix it?

For me it was the appdynamics app agent

Nico-Strecker avatar Jul 15 '25 17:07 Nico-Strecker

I am also using appdynamics, how AppDynamics impact on Spring boot application startup?

BCS-ChaitaliS avatar Jul 15 '25 20:07 BCS-ChaitaliS

You for sure use the AppDynamics agent that modifies the bytecode; something there causes it to mess with the order of beans.

I found this out by running the agent locally and running a script that starts the app multiple times and checks if it's healthy. In about 30% of the startups, AppDynamics confused the order. What was interesting to me was that it only happens sometimes; I guess some race condition causes the issue in the Java agent.

If you can see the startup command for your app, there should be a flag enabling the AppDynamics Java agent.

Nico-Strecker avatar Jul 16 '25 05:07 Nico-Strecker

I'm having similar issues, lost parameter name metadata and Spring Boot 3.5.4 failing to map rest controller params to request params or to evaluate Spel expressions, all random. Sometimes working properly for days until it happens. I'm currently using java 17 and also app dynamics. On what java version have you encountered this ?

anistor avatar Aug 17 '25 20:08 anistor

I'm having similar issues, lost parameter name metadata and Spring Boot 3.5.4 failing to map rest controller params to request params or to evaluate Spel expresions, all random. Sometimes working properly for days untul it happens. I'm currently using java 17 and also app dynamics. On what java version have you enountered this ?

It was also Java 17 i wrote a script that started the app multiple times in multiple instances that checked the health endpoint maby something similar could help you to find out if it happens because of appdynamics

Nico-Strecker avatar Aug 17 '25 21:08 Nico-Strecker

I was able to easily reproduce the error on Java 17.0.13, with AppD agent 24.4.1.35880. The error does not show up unless we have the agent installed, so the usage of instrumentation api seems to be a key fact but the agent is not necessarily at fault. This is very likely just a JVM 17 issue only, because with Java 21 I'm not able to reproduce it so far, with or without the agent. The problem looks very similar to what is reported here: https://bugs.java.com/bugdatabase/view_bug?bug_id=8240908 . I'm posting this on a closed issue for others to know to stop digging for solutions in the wrong direction, just go ahead an upgrade to at least Java 21 and that should solve the problem.

anistor avatar Aug 19 '25 07:08 anistor