@PropertySource 不会覆盖 application.properties 中定义的属性

问题描述 投票:0回答:0

如果在

application.properties
中定义了任何属性,则不能通过使用
.properties
注释在其他
@PropertySource
文件中重新定义它来覆盖它。此错误仅在原始值存在于
application.properties
中时才有效。任何其他文件(例如
app.properties
)将允许成功覆盖其值。

例如:

application.properties

test.application=original

app.properties

test.app=original

override.properties

test.application=overridden
test.app=overridden

ApplicationPropertiesConfig.java

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

@Configuration
@Data
@PropertySource(value = {
        "classpath:application.properties",
        "classpath:app.properties",
        "classpath:override.properties"
})
@ConfigurationProperties(prefix = "test")
public class ApplicationPropertiesConfig {

    private String application;  // == "original"

    private String app;          // == "overridden"

}

在上面的配置中,字段

application
不会在创建bean时被覆盖,并将保持其在
application.properties
中定义的原始值。

最新的 Spring Boot 版本证实了这一点:2.7.11 和 3.0.6.

即使

application.properties
未在
@PropertySource
下列出或使用了
@PropertySources
注释,也会观察到相同的行为。

重现问题的代码在这里:https://github.com/denisab85/spring-property-overriding

一个已知的解决方法是将

application.properties
重命名为其他名称(例如
app.properties
)。覆盖正常工作。但由于项目的大小,许多类已经依赖默认
application.properties
,这在我的情况下不起作用。 资料来源:Maksim Muruev (mmuruev) 在 @PropertySource 中的评论未按顺序覆盖 [SPR-13500].

java spring spring-boot properties-file spring-context
© www.soinside.com 2019 - 2024. All rights reserved.