SpringBoot激活profile时禁止读取默认yaml属性及必填配置校验方案
问题1 禁止缺省属性 fallback 到默认application.yaml的方案
有两种常用实现方式,可根据场景选择:
- 方案1:调整配置文件组织规则(无代码侵入,推荐)
直接弃用无profile标识的application.yaml作为公共配置,将原公共配置统一放到例如application-common.yaml中,需要使用公共配置的profile通过spring.profiles.include: common主动引入。不需要公共配置的profile不做引入即可,不会自动加载默认无profile的配置。 - 方案2:自定义配置源加载逻辑(灵活度更高)
实现EnvironmentPostProcessor接口,在配置加载阶段主动移除默认application.yaml的配置源:
之后在public class RemoveDefaultConfigPostProcessor implements EnvironmentPostProcessor { @Override public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) { MutablePropertySources sources = environment.getPropertySources(); // 移除默认类路径下application.yaml的配置源 sources.remove("class path resource [application.yaml]"); } }resources/META-INF/spring.factories中注册该处理器即可生效:org.springframework.boot.env.EnvironmentPostProcessor=你的包路径.RemoveDefaultConfigPostProcessor
问题2 更优的必填配置校验方案
推荐使用SpringBoot官方的@ConfigurationProperties配合校验框架实现,是业界通用的标准方案,比在Bean构造方法中手动校验可维护性高很多:
- 首先引入校验依赖(SpringBoot 2.3+默认不带校验启动器,需手动引入)
<!-- Maven 依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> - 编写统一配置类,加校验注解
@ConfigurationProperties(prefix = "application") @Validated // 开启配置校验 public class AppConfigProperties { // 可根据需求选@NotNull/@NotBlank等注解,字符串非空一般用@NotBlank @NotBlank(message = "必填配置application.app-url不能为空,请检查对应环境的配置文件") private String appUrl; // 省略getter/setter,也可用Lombok的@Data简化 } - 在启动类上开启配置属性扫描
@SpringBootApplication @EnableConfigurationProperties(AppConfigProperties.class) public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
配置完成后,应用启动时会自动校验所有标注了校验注解的配置项,缺失/不满足规则会直接抛出BindValidationException终止启动,报错信息清晰,所有必填配置也可以集中在配置类中管理,不会散落在各个业务Bean中。
内容的提问来源于stack exchange,提问作者Иван Темерёв
相关产品推荐
相关产品推荐

