Spring Boot @ConfigurationProperties校验失败如何跳过无效配置不终止启动
实现方案
步骤1:修正Test类的冗余注解
Test作为配置属性映射的普通POJO,不需要作为独立Spring配置类注册,先移除类上的@Configuration、@Validated注解,避免触发无关的全局校验:
public class Test { @NotEmpty private String name; private String optionalOne; private String optionalTwo; @NotEmpty private String location; // 省略getter、setter方法 }
步骤2:自定义TestConfig的校验逻辑
移除testRecords字段上的@Valid注解,关闭Spring的自动校验触发逻辑,改为在Bean初始化阶段手动执行校验、过滤无效配置:
@ConfigurationProperties(prefix = "test.config") public class TestConfig implements InitializingBean { private Map<String, Test> testRecords = new HashMap<>(); // 注入JSR-380校验器,Spring Boot 1.5.x版本默认会自动装配该实例 @Autowired private Validator validator; @Override public void afterPropertiesSet() { if (testRecords.isEmpty()) { return; } Map<String, Test> validRecords = new HashMap<>(); // 遍历所有配置项逐个校验 testRecords.forEach((configKey, configValue) -> { Set<ConstraintViolation<Test>> violations = validator.validate(configValue); if (violations.isEmpty()) { validRecords.put(configKey, configValue); } else { // 打印校验失败日志 String errorMsg = violations.stream() .map(v -> v.getPropertyPath() + " " + v.getMessage()) .collect(Collectors.joining(",")); log.warn("配置项 test.config.{} 校验失败已跳过,错误原因:{}", configKey, errorMsg); } }); // 替换为仅保留有效配置的集合 this.testRecords = validRecords; } // 省略getter、setter方法 }
步骤3:开启配置属性绑定
在启动类或任意配置类上添加@EnableConfigurationProperties(TestConfig.class)注解,保证配置属性绑定逻辑生效即可。
原理解释
Spring默认对带@Valid注解的集合类型配置属性执行全量校验,任意元素校验失败都会抛出BindException终止应用启动。我们通过关闭自动校验、手动遍历校验过滤的方式,既保留了注解校验的能力,又不会因为部分配置异常导致启动失败,仅加载校验通过的有效配置。
内容的提问来源于stack exchange,提问作者tunesmith
相关产品推荐
相关产品推荐

