Java 如何在Spring表达式语言中处理多个回退值

Java 如何在Spring表达式语言中处理多个回退值,java,spring,spring-el,Java,Spring,Spring El,问题是:我如何处理Spring表达式中的一系列回退值,允许我回退到更高级别的配置,直到得到一个定义的值 为了稍作解释,让我们用我自己的用例来说明这一点:我打算使用@Scheduled注释创建一个Spring应用程序来运行一些进程。问题是我有很多计划的任务,我会让运行频率可以很容易地为所有任务配置,或者只为一个子集配置 所以我在找类似的东西 @组件 公共类特定TaskRunner{ @已计划(cron=“${specific task cron?:task families cron?:defau

问题是:我如何处理Spring表达式中的一系列回退值,允许我回退到更高级别的配置,直到得到一个定义的值

为了稍作解释,让我们用我自己的用例来说明这一点:我打算使用
@Scheduled
注释创建一个Spring应用程序来运行一些进程。问题是我有很多计划的任务,我会让运行频率可以很容易地为所有任务配置,或者只为一个子集配置

所以我在找类似的东西

@组件
公共类特定TaskRunner{
@已计划(cron=“${specific task cron?:task families cron?:default cron}”)
公共任务(){
doSomething();
}
}
让应用程序通过覆盖
默认cron
值一次配置所有计划任务的频率,或者通过覆盖任务族属性仅配置其中的一个子集,或者最后根据任务进行指定。这种方法的优点是,它允许使用多个配置级别,因为每个计划任务都会从最具体的属性开始寻找合适的属性,并寻找更通用的属性,直到定义了某个属性,最终依赖于默认的全局值


不幸的是。。。这是行不通的。计算时,如果未定义第一个元素,则返回剩余的全部元素。在本例中,这意味着如果配置遗漏了
特定任务cron
的值,则解析的值为:
任务族cron?:默认cron
,不幸的是,这不是我要查找的

我找到了两种处理方法:

第一个,纯粹基于Spring表达式。如果Elvis运算符也是Spring表达式,则Spring似乎会重新计算其结果。因此,我的工作配置是:

@组件
公共类特定TaskRunner{
@已计划(cron=“${specific task cron?:${task families cron?:default cron}”)
公共任务(){
doSomething();
}
}
在我的实际用例中,再加上一个回退,这并不是很方便

因此,我选择了一个更简单的解决方案,通过以下方式定义一个价值链,该解决方案依赖于配置:

#application.yml
默认cron:'0*/50'#每5分钟
任务族cron:${default cron}
特定任务cron:${task families cron}
结合

@组件
公共类特定TaskRunner{
@已计划(cron=“${specific task cron}”)
公共任务(){
doSomething();
}
}
这样,属性的任何重写都将应用于分层子级别,除非它们自己被重写


这两种解决方案似乎都有效,所以最后,是的,Spring表达式语言可以处理多个回退。是否应该使用它,或者配置方法是否可读性更好。。。我让你决定。

我找到了两种处理方法:

第一个,纯粹基于Spring表达式。如果Elvis运算符也是Spring表达式,则Spring似乎会重新计算其结果。因此,我的工作配置是:

@组件
公共类特定TaskRunner{
@已计划(cron=“${specific task cron?:${task families cron?:default cron}”)
公共任务(){
doSomething();
}
}
在我的实际用例中,再加上一个回退,这并不是很方便

因此,我选择了一个更简单的解决方案,通过以下方式定义一个价值链,该解决方案依赖于配置:

#application.yml
默认cron:'0*/50'#每5分钟
任务族cron:${default cron}
特定任务cron:${task families cron}
结合

@组件
公共类特定TaskRunner{
@已计划(cron=“${specific task cron}”)
公共任务(){
doSomething();
}
}
这样,属性的任何重写都将应用于分层子级别,除非它们自己被重写

这两种解决方案似乎都有效,所以最后,是的,Spring表达式语言可以处理多个回退。是否应该使用它,或者配置方法是否可读性更好。。。我让你决定