如果在
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
,这在我的情况下不起作用。 资料来源:Maksim Muruev (mmuruev) 在 @PropertySource 中的评论未按顺序覆盖 [SPR-13500].application.properties