Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

Configuring management.server.port via a config tree results in a ConverterNotFoundException when the management context is refreshed #32941

Closed
Ranganathan95 opened this issue Nov 1, 2022 · 1 comment
Assignees
Labels
type: bug A general bug
Milestone

Comments

@Ranganathan95
Copy link

Ranganathan95 commented Nov 1, 2022

Hi,

Recently upgraded the spring actuator from 2.4.10 to 2.7.4.

In our project, we are using the configTree import in Kubernetes as below

spring.config.import: "configtree:/app/**"

There is config file binding of "management.server.port" with value 8081 and "server.port" with value 8080

Getting the below error after upgrading:

Caused by: java.lang.IllegalStateException: Error processing condition on org.springframework.boot.actuate.autoconfigure.endpoint.web.reactive.WebFluxEndpointManagementContextConfiguration.managementHealthEndpointWebFluxHandlerMapping
	at org.springframework.boot.autoconfigure.condition.SpringBootCondition.matches(SpringBootCondition.java:60)
	at org.springframework.context.annotation.ConditionEvaluator.shouldSkip(ConditionEvaluator.java:108)
	at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForBeanMethod(ConfigurationClassBeanDefinitionReader.java:193)
	at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass(ConfigurationClassBeanDefinitionReader.java:153)
	at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitions(ConfigurationClassBeanDefinitionReader.java:129)
	at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:343)
	at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:247)
	at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:311)
	at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:112)
	at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:746)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:564)
	at org.springframework.boot.web.reactive.context.ReactiveWebServerApplicationContext.refresh(ReactiveWebServerApplicationContext.java:66)
	at org.springframework.boot.actuate.autoconfigure.web.server.ManagementContextAutoConfiguration$DifferentManagementContextConfiguration.onApplicationEvent(ManagementContextAutoConfiguration.java:150)
	at org.springframework.boot.actuate.autoconfigure.web.server.ManagementContextAutoConfiguration$DifferentManagementContextConfiguration.onApplicationEvent(ManagementContextAutoConfiguration.java:122)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:176)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:169)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:143)
	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:421)
	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:378)
	at org.springframework.boot.web.reactive.context.WebServerManager.start(WebServerManager.java:57)
	at org.springframework.boot.web.reactive.context.WebServerStartStopLifecycle.start(WebServerStartStopLifecycle.java:40)
	at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:178)
	... 14 common frames omitted
Caused by: org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [org.springframework.boot.env.ConfigTreePropertySource$PropertyFileContent] to type [java.lang.Integer]
	at org.springframework.core.convert.support.GenericConversionService.handleConverterNotFound(GenericConversionService.java:322)
	at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:195)
	at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:175)
	at org.springframework.core.env.AbstractPropertyResolver.convertValueIfNecessary(AbstractPropertyResolver.java:265)
	at org.springframework.core.env.PropertySourcesPropertyResolver.getProperty(PropertySourcesPropertyResolver.java:91)
	at org.springframework.core.env.PropertySourcesPropertyResolver.getProperty(PropertySourcesPropertyResolver.java:68)
	at org.springframework.core.env.AbstractEnvironment.getProperty(AbstractEnvironment.java:605)
	at org.springframework.boot.actuate.autoconfigure.web.server.ManagementPortType.getPortProperty(ManagementPortType.java:64)
	at org.springframework.boot.actuate.autoconfigure.web.server.ManagementPortType.get(ManagementPortType.java:58)
	at org.springframework.boot.actuate.autoconfigure.web.server.OnManagementPortCondition.getMatchOutcome(OnManagementPortCondition.java:49)
	at org.springframework.boot.autoconfigure.condition.SpringBootCondition.matches(SpringBootCondition.java:47)
	... 35 common frames omitted

To reproduce the issue,

Configure the different port for server.port and management.server.port and import the configuration with configtree.

Suspect:
CharSequenceToObjectConverter is not invoking for the WebFluxEndpointManagementContextConfiguration.managementHealthEndpointWebFluxHandlerMapping and also noticed this method included after 2.5.+

Much appreciated if you provide workaround if any till fixing the issue

@spring-projects-issues spring-projects-issues added the status: waiting-for-triage An issue we've not yet triaged label Nov 1, 2022
@wilkinsona wilkinsona changed the title Spring reactive - Webflux Actuator - ManagementPortType Different port with spring config import (configtree) - Getting error ConverterNotFoundException Configuring management.server.port via a config tree results in a ConverterNotFoundException when the management context is refreshed Nov 2, 2022
@wilkinsona wilkinsona added type: bug A general bug and removed status: waiting-for-triage An issue we've not yet triaged labels Nov 2, 2022
@wilkinsona wilkinsona added this to the 2.6.x milestone Nov 2, 2022
@wilkinsona
Copy link
Member

wilkinsona commented Nov 2, 2022

Thanks for the report.

The problem's due to the way in which the child application context for the management server is created. The main application context contains an Environment that uses a ConfigurationPropertySourcesPropertyResolver with an ApplicationConversionService. The conversion service contains a CharSequenceToObjectConverter that allows the PropertyFileContent, which implements CharSequence, to be converted to an Integer. When the child context is created, this conversion service is lost and its Environment uses a PropertySourcesPropertyResolver with a DefaultConversion service which is unable to perform the necessary conversion.

I think the simplest fix would be to configure the child context's Environment to use the same ConversionService as the parent context. However, that would still leave the child context's Environment with a different PropertyResolver implementation. The Environment implementations themselves would also be different. I'd like to discuss this with the team to see how much we want to try to align things.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
type: bug A general bug
Projects
None yet
Development

No branches or pull requests

4 participants