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?

Comment From: wilkinsona

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.

Comment From: Nico-Strecker

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

Comment From: 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.

Comment From: 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.

Comment From: wilkinsona

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.

Comment From: Nico-Strecker

@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

Comment From: 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

Comment From: wilkinsona

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

Comment From: Nico-Strecker

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

Comment From: 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]

Comment From: 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

Comment From: 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

Comment From: 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 💚

Comment From: 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?

Comment From: 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?

For me it was the appdynamics app agent

Comment From: BCS-ChaitaliS

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

Comment From: Nico-Strecker

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.

Comment From: 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 ?

Comment From: 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 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