簡體   English   中英

PropertySourcesPlaceholderConfigurer打破春天

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM