当前位置: 首页 > 知识库问答 >
问题:

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

戴浩初
2023-03-14

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

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

所以我在找类似的东西

@Component
public class SpecificTaskRunner {

   @Scheduled(cron = "${ specific-task-cron ?: task-families-cron ?: default-cron }")
   public void specificTask() {
      doSomething();
   }

}

让应用程序通过覆盖默认cron值一次配置所有计划任务的频率,或者通过覆盖task family属性只配置其中的一个子集,或者最后根据任务进行指定。这种方法的优点是,它允许使用多个配置级别,因为每个计划任务都从最具体的属性开始寻找合适的属性,并寻找更通用的属性,直到定义了某个属性,最终依赖于默认的全局值。

不幸的是...这不工作。当进行评估时,如果第一个元素未被定义,则如果回退则整个剩余。在这个例子中,这意味着如果配置错过了一个值为特定任务-cron,那么解决的值是:任务-家庭-cron?: default-cron不幸的是,这不是我要找的!

共有1个答案

韩智明
2023-03-14

我找到了两种方法来处理它:

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

@Component
public class SpecificTaskRunner {

   @Scheduled(cron = "${ specific-task-cron ?: ${ task-families-cron ?: default-cron }}")
   public void specificTask() {
      doSomething();
   }

}

在我的实际用例中,再加上一个回退,这并不是很方便。。。

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

#application.yml

default-cron: '0 */5 0 0 0 0' #every 5 minutes
task-families-cron: ${default-cron}
specific-task-cron: ${task-families-cron}

与…结合

@Component
public class SpecificTaskRunner {

   @Scheduled(cron = "${specific-task-cron}")
   public void specificTask() {
      doSomething();
   }

}

这样,属性的任何重写都将应用于分层子级别,除非它们自己被重写。

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

 类似资料:
  • 本文章将介绍Thymeleaf Spring表达式语法中的概念。 Spring Expression Language(简称SpEL)是一种强大的表达式语言,支持在运行时查询和操作对象图。 语言语法类似于Unified EL,但提供了额外的功能,特别是方法调用和基本的字符串模板功能。 Spring表达式语言的创建旨在为Spring社区提供单一支持的表达式语言。 它的语言特性是由Spring项目中的

  • 主要内容:示例,SpEL对Bean定义的支持,SpEL中的运算符,SpEL中的变量Spring Expression Language(简称 SpEL)是一种功能强大的表达式语言,支持运行时查询和操作对象图 。表达式语言一般是用最简单的形式完成最主要的工作,以此减少工作量。 Java 有许多可用的表达式语言,例如 JSP EL,OGNL,MVEL 和 JBoss EL,SpEL 语法类似于 JSP EL,功能类似于 Struts2 中的 OGNL,能在运行时构建复杂表达式、存取

  • 问题内容: 我正在使用jsp和java编写程序,如何使用属性文件支持多种语言?顺便说一句,总是有\ u4345之类的东西,这是什么?他们怎么来的? 问题答案: 对于多种语言,请签出ResourceBundle类。 关于,这是Java黑暗而令人讨厌的遗留角落之一。属性文件必须使用ASCII,因此所有非ASCII字符都需要编码为(其Unicode值)。您可以使用native2ascii命令行工具将文件

  • 问题 如何在groovy Spring Boot项目中定义Spring表达式语言(SpEL)?(每个Spring调度器crontab@调度注释) Spring Boot Groovy和Spring EL调度器 根据来自web的文档,我正在groovy spring boot应用程序(2.2.x)中使用spring scheduler 根据这篇文章:任务调度使用cron表达式从属性文件 试过这个 我

  • 我想使用SpEL来评估一些谓词。由于值/属性是动态的,我没有某个bean类。因此,我们有一个hashmap,其中(根据应用状态)键映射到不同的POJO/bean,例如: 我们希望通过设置变量来使用评估上下文,比如: 但这带来了一个例外: SpelEvaluationException:EL1007E:(位置0):在null上找不到属性或字段“person” 有人给我建议吗?