字面量表达式
SpEL 支持以下类型的字面量表达式。
字符串
字符串可以用单引号('
)或双引号("
)来界定。要在用单引号括起来的字符串字面量中包含一个单引号,可以使用两个相邻的单引号字符。同样地,要在用双引号括起来的字符串字面量中包含一个双引号,可以使用两个相邻的双引号字符。
数字
数字支持使用负号、指数表示法和小数点。
-
整数:
int
或long
-
十六进制:
int
或long
-
实数:
float
或double
- 默认情况下,实数使用
Double.parseDouble()
进行解析。
- 默认情况下,实数使用
布尔值
true
或 false
空值
null
由于 Spring 表达式语言的设计和实现,字面量数字在内部始终以正数形式存储。
例如,-2
在内部存储为正数 2
,然后在计算表达式时取反(通过计算 0 - 2
的值)。
这意味着无法在 Java 中表示等于该类型数字最小值的最小负数字面量。例如,Java 中 int
类型支持的最小值是 Integer.MIN_VALUE
,其值为 -2147483648
。然而,如果你在 SpEL 表达式中包含 -2147483648
,将会抛出一个异常,提示你无法将值 2147483648
解析为 int
类型(因为它超过了 Integer.MAX_VALUE
的值,即 2147483647
)。
如果你需要在 SpEL 表达式中使用特定类型数字的最小值,可以引用相应包装类型的 MIN_VALUE
常量(如 Integer.MIN_VALUE
、Long.MIN_VALUE
等),或者计算最小值。例如,要使用最小整数值:
-
T(Integer).MIN_VALUE
— 需要StandardEvaluationContext
-
-2^31
— 可以与任何类型的EvaluationContext
一起使用
以下列表展示了字面量的简单用法。通常情况下,它们不会像这样单独使用,而是作为更复杂表达式的一部分——例如,在逻辑比较运算符的一侧使用字面量,或作为方法的参数。
- Java
- Kotlin
ExpressionParser parser = new SpelExpressionParser();
// evaluates to "Hello World"
String helloWorld = (String) parser.parseExpression("'Hello World'").getValue();
// evaluates to "Tony's Pizza"
String pizzaParlor = (String) parser.parseExpression("'Tony''s Pizza'").getValue();
double avogadrosNumber = (Double) parser.parseExpression("6.0221415E+23").getValue();
// evaluates to 2147483647
int maxValue = (Integer) parser.parseExpression("0x7FFFFFFF").getValue();
boolean trueValue = (Boolean) parser.parseExpression("true").getValue();
Object nullValue = parser.parseExpression("null").getValue();
val parser = SpelExpressionParser()
// evaluates to "Hello World"
val helloWorld = parser.parseExpression("'Hello World'").value as String
// evaluates to "Tony's Pizza"
val pizzaParlor = parser.parseExpression("'Tony''s Pizza'").value as String
val avogadrosNumber = parser.parseExpression("6.0221415E+23").value as Double
// evaluates to 2147483647
val maxValue = parser.parseExpression("0x7FFFFFFF").value as Int
val trueValue = parser.parseExpression("true").value as Boolean
val nullValue = parser.parseExpression("null").value