另一种方法是创建一个实现Validator 的@ConfigurationProperties 类:
@Data
@Validated
@ConfigurationProperties(prefix="my")
public class AppProperties implements Validator {
private String name;
private List<String> validNames;
@Override
public boolean supports(Class<?> clazz) {
return AppProperties.class.isAssignableFrom(clazz);
}
@Override
public void validate(Object target, Errors errors) {
AppProperties config = (AppProperties) target;
ValidationUtils.rejectIfEmpty(
errors, "name", "required-field", "name is required");
if (!config.validApiNames.contains(config.apiName)) {
errors.rejectValue("apiName " + apiName, "invalid");
}
}
}
并确保通过 @EnableConfigurationProperties 启用您的 ConfigurationProperties 类:
@SpringBootApplication
@EnableConfigurationProperties(AppProperties.class)
public class Application {
// ...
}
如果你在 application.properties 中有这样的东西,上面应该可以工作:
validNames=name1,name2
name=name1
我添加了对有效值的检查,主要是作为一个使用示例。但它确实可以防止无效的命令行参数(提供时,override application.properties 中的那些)。
请注意,在 Spring Boot 2.6.3 前后,ConfigurationProperties 上的 prefix 参数是可选的。