为了账号安全,请及时绑定邮箱和手机立即绑定

具有预设默认值的弹簧启动配置?

具有预设默认值的弹簧启动配置?

慕虎7371278 2022-09-22 15:56:09

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


虽然这似乎很容易和简单,但意识到这一点是相当臃肿和违反直觉的。


我的最小示例如下所示:


应用.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;

    }

}

现在,这似乎需要大量的代码来简单地设置一个参数。有没有一种更优雅,更苗条,更精益的方式来做到这一点?


查看完整描述

2 回答

?
莫回无

TA贡献1556条经验 获得超7个赞

你必须使用SpEL(弹簧表达式语言),这是一个非常强大的工具:)


比你可以做这样的事情:


@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


查看完整回答
反对 回复 2022-09-22
?
阿晨1998

TA贡献1733条经验 获得超5个赞

可以使用一些验证约束,例如 、和包 Java 验证 API 中的许多其他约束@Max@Min@NotEmpty

请参阅春季文档

下面是一个示例:

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 

}


查看完整回答
反对 回复 2022-09-22

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信