[英]Spring boot PropertySourcesPlaceHolderConfigurer with @ProperySource
[英]PropertySourcesPlaceholderConfigurer breaks Spring
編輯:解決了,請看下面我的評論。
項目組織:
my.package
MyApplication.java
spring
MyConfiguration.java
MyApplication.java
:
@SpringBootApplication
class MyApplication {
private final ApplicationContext applicationContext;
MyApplication(final ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
}
...
public static void main(final String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
MyConfiguration.java
:
@Configuration
@ComponentScan(
useDefaultFilters = false,
basePackages = "...",
includeFilters = @Filter(
type = FilterType.REGEX,
pattern = "..."
)
)
class MyConfiguration {
private final ApplicationContext context;
MyConfiguration(final ApplicationContext context) {
this.context = context;
}
@Bean
PropertySourcesPlaceholderConfigurer configurer() {
// For test purpose
return new PropertySourcesPlaceholderConfigurer();
}
}
此設置將引發:
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1248) ~[spring-boot-2.1.2.RELEASE.jar:2.1.2.RELEASE]
at my.package.MyApplication.main(MyApplication.java:163) ~[classes/:na]
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [my.package.spring.MyConfiguration$$EnhancerBySpringCGLIB$$d0d9c3b2]: No default constructor found; nested exception is java.lang.NoSuchMethodException: my.package.spring.MyConfiguration$$EnhancerBySpringCGLIB$$d0d9c3b2.<init>()
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:83) ~[spring-beans-5.1.4.RELEASE.jar:5.1.4.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1262) ~[spring-beans-5.1.4.RELEASE.jar:5.1.4.RELEASE]
... 26 common frames omitted
Caused by: java.lang.NoSuchMethodException: my.package.spring.MyConfiguration$$EnhancerBySpringCGLIB$$d0d9c3b2.<init>()
at java.base/java.lang.Class.getConstructor0(Class.java:3350) ~[na:na]
at java.base/java.lang.Class.getDeclaredConstructor(Class.java:2554) ~[na:na]
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:78) ~[spring-beans-5.1.4.RELEASE.jar:5.1.4.RELEASE]
... 27 common frames omitted
使用所有其他可能的Bean類型不會導致任何錯誤。 我要瘋了。 不明白為什么。
這里的問題不是PropertySourcesPlaceholderConfigurer
,而是您覆蓋了Configuration
類的默認構造函數。 Spring需要一個至少具有包私有訪問權限的默認構造函數來實例化該類。 加
MyConfiguration() {
}
到MyConfiguration,一切將開始工作。
配置中的構造函數可以具有參數,並且該類可以是程序包專用的。
但是,您的PropertySourcesPlaceholderConfigurer
bean必須是公共的和靜態的。
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer(){
return new PropertySourcesPlaceholderConfigurer();
}
這對我有用(如果我從PropertySourcePlaceholderConfigurer中刪除靜態和/或公共對象,則失敗):
@Configuration
public class WebConfiguration {
private final ApplicationContext context;
WebConfiguration(ApplicationContext context) {
this.context = context;
}
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer(){
return new PropertySourcesPlaceholderConfigurer();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.