在 Spring Boot 2.1 中使用配置时,我一直在思考如何实现正确的配置管理的问题,其中我既有属性文件中的参数,也有配置参数的硬编码值,以及每个参数的默认值。最后,我需要对每个参数进行某种“完整性检查”,例如检查整数是否在指定范围内。
虽然这看起来很简单,但实现起来却相当臃肿且违反直觉。
我的最小示例如下所示:
应用程序.yml
param1=42
配置.java
@Configuration
@PropertySource("classpath:application.yml")
public class Config {
private static final int DEFAULT_PARAM1 = 1;
private static final int PARAM1_MIN = 1;
private static final int PARAM1_MAX = 5;
@Autowired
private int param1;
public int getParam1() {
return param1;
}
@PostConstruct
public void init() {
if(param1 == null || !checkParam1(param1)) param1 = DEFAULT_PARAM1;
}
public boolean checkParam1(param)
{
if(param > PARAM1_MIN || param < PARAM1_MAX)
return true;
else return false;
}
public void set setParam1(int param) {
if(checkParam1(param))
param1 = param;
}
}
现在,这似乎是一个非常多的代码来简单地设置一个参数。有没有更优雅、更 slim 、更精简的方法来做到这一点?
最佳答案
你必须使用 SpEL(Spring 表达式语言),一个非常强大的工具:)
你可以做这样的事情:
@Value("#{${my.param} > PARAM1_MIN || ${my.param} < PARAM1_MAX ? ${my.param} : DEFAULT_PARAM1"})
private int param;
或者也许更具可读性:
@Value("#{checker.inRange(${my.param})}")
private int param;
带有组件:
@Component("checker")
private class PropertyChecker {
public int inRange(int param) {
......
}
}
这里有一个很好的教程:https://www.baeldung.com/spring-expression-language 或:https://www.baeldung.com/spring-value-annotation
关于java - Spring Boot 配置是否带有预设默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55533756/