This repository was archived by the owner on Feb 23, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 348
This repository was archived by the owner on Feb 23, 2023. It is now read-only.
Add support for @ConfigurationPropertiesScan #716
Copy link
Copy link
Closed
Labels
type: compatibilityNative image compatibility issueNative image compatibility issue
Milestone
Description
In a native application, @ConfigurationPropertiesScan
does not work and the configuration properties instance does not get registered. As a result, NoSuchBeanDefinitionException
occurs.
Here are snippets of the code I tried.
package am.ik.blog.prometheus;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.ConstructorBinding;
@ConfigurationProperties(prefix = "prometheus")
@ConstructorBinding
public class Prometheus {
private final String url;
public Prometheus(String url) {
this.url = url;
}
public String getUrl() {
return url;
}
}
package am.ik.blog.prometheus;
import org.springframework.stereotype.Component;
@Component
public class PrometheusClient {
public PrometheusClient(Prometheus prometheus) {
// ...
}
// ...
}
@SpringBootApplication
@ConfigurationPropertiesScan
public class App {
// ...
}
and the stacktrace.
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'prometheusClient' defined in class path resource [am/ik/blog/prometheus/PrometheusClient.class]: Unsatisfied dependency expressed through constructor parameter 1; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'am.ik.blog.prometheus.Prometheus' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) ~[na:na]
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:229) ~[na:na]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1354) ~[na:na]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1204) ~[na:na]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:564) ~[na:na]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:524) ~[na:na]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[na:na]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[na:na]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[na:na]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[na:na]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:944) ~[na:na]
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918) ~[na:na]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) ~[na:na]
at org.springframework.boot.web.reactive.context.ReactiveWebServerApplicationContext.refresh(ReactiveWebServerApplicationContext.java:63) ~[na:na]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:769) ~[blog-frontend-server:2.4.4]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:761) ~[blog-frontend-server:2.4.4]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:426) ~[blog-frontend-server:2.4.4]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:326) ~[blog-frontend-server:2.4.4]
at org.springframework.boot.builder.SpringApplicationBuilder.run(SpringApplicationBuilder.java:144) [blog-frontend-server:2.4.4]
at am.ik.blog.App.main(App.java:62) [blog-frontend-server:5.0.0-SNAPSHOT]
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'am.ik.blog.prometheus.Prometheus' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1790) ~[na:na]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1346) ~[na:na]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1300) ~[na:na]
at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887) ~[na:na]
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) ~[na:na]
... 19 common frames omitted
As a workaround, using @EnableConfigurationProperties({ Prometheus.class })
instead works.
bendi
Metadata
Metadata
Assignees
Labels
type: compatibilityNative image compatibility issueNative image compatibility issue