Spring Boot配置具有预设的默认值?

时间:2019-04-05 10:48:50

标签: java spring-boot configuration

在Spring Boot 2.1中使用配置,我绕着如何实现适当的配置管理的问题盘旋,我同时拥有属性文件中的参数和硬编码值als配置参数,以及每个参数的默认值。最后,我需要对每个参数进行某种“完整性检查”,例如检查整数是否在指定范围内。

虽然这看起来很容易和简单,但是实现起来却很肿并且违反直觉。

我的最小示例如下:

application.yml

param1=42

Config.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;
    }
}

现在这似乎是很多代码,只需设置ONE参数即可。有没有更优雅,苗条和精益的方法来做到这一点?

2 个答案:

答案 0 :(得分:1)

可以使用某些验证约束,例如@Max@Min@NotEmpty和其他java validation API包中的验证约束

请参见Spring doc

这是一个示例:

public class User {

    @NotNull(message = "Name cannot be null")
    private String name;

    @AssertTrue
    private boolean working;

    @Size(min = 10, max = 200, message 
      = "About Me must be between 10 and 200 characters")
    private String aboutMe;

    @Min(value = 18, message = "Age should not be less than 18")
    @Max(value = 150, message = "Age should not be greater than 150")
    private int age;

    @Email(message = "Email should be valid")
    private String email;

    // standard setters and getters 
}

article更为详细

答案 1 :(得分:1)

您必须使用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