此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Framework 6.2.10spring-doc.cadn.net.cn

Varargs 调用

Spring 表达式语言支持对构造函数方法和用户定义函数varargs 调用。spring-doc.cadn.net.cn

以下示例显示了如何调用java.lang.String#formatted(Object…​) varargs 方法,通过提供变量参数列表作为单独的 参数 ('blue', 1).spring-doc.cadn.net.cn

// evaluates to "blue is color #1"
String expression = "'%s is color #%d'.formatted('blue', 1)";
String message = parser.parseExpression(expression).getValue(String.class);
// evaluates to "blue is color #1"
val expression = "'%s is color #%d'.formatted('blue', 1)"
val message = parser.parseExpression(expression).getValue(String::class.java)

变量参数列表也可以作为数组提供,如 以下示例 (new Object[] {'blue', 1}).spring-doc.cadn.net.cn

// evaluates to "blue is color #1"
String expression = "'%s is color #%d'.formatted(new Object[] {'blue', 1})";
String message = parser.parseExpression(expression).getValue(String.class);
// evaluates to "blue is color #1"
val expression = "'%s is color #%d'.formatted(new Object[] {'blue', 1})"
val message = parser.parseExpression(expression).getValue(String::class.java)

作为替代方案,可以将变量参数列表作为java.util.List–为 示例,作为内联列表 ({'blue', 1}).以下示例演示了如何执行此作。spring-doc.cadn.net.cn

// evaluates to "blue is color #1"
String expression = "'%s is color #%d'.formatted({'blue', 1})";
String message = parser.parseExpression(expression).getValue(String.class);
// evaluates to "blue is color #1"
val expression = "'%s is color #%d'.formatted({'blue', 1})"
val message = parser.parseExpression(expression).getValue(String::class.java)

Varargs 类型转换

与Java中对varargs调用的标准支持相比,类型转换可能是 在调用 varargs 构造函数、方法或 SpEL 中的函数。spring-doc.cadn.net.cn

例如,如果我们在EvaluationContext在名称下#reverseStrings对于具有签名的方法String reverseStrings(String…​ strings),我们可以在 SpEL 中调用该函数 表达式,其中包含任何可以转换为String,如 以下示例。spring-doc.cadn.net.cn

// evaluates to "3.0, 2.0, 1, SpEL"
String expression = "#reverseStrings('SpEL', 1, 10F / 5, 3.0000)";
String message = parser.parseExpression(expression)
		.getValue(evaluationContext, String.class);
// evaluates to "3.0, 2.0, 1, SpEL"
val expression = "#reverseStrings('SpEL', 1, 10F / 5, 3.0000)"
val message = parser.parseExpression(expression)
		.getValue(evaluationContext, String::class.java)

类似地,任何组件类型是所需 varargs 类型的子类型的数组都可以 作为 varargs 调用的变量参数列表提供。例如,一个String[]数组可以提供给接受Object…​参数列表。spring-doc.cadn.net.cn

以下列表表明我们可以提供String[]数组添加到java.lang.String#formatted(Object…​) varargs 方法。它还强调1将自动转换为"1".spring-doc.cadn.net.cn

// evaluates to "blue is color #1"
String expression = "'%s is color #%s'.formatted(new String[] {'blue', 1})";
String message = parser.parseExpression(expression).getValue(String.class);
// evaluates to "blue is color #1"
val expression = "'%s is color #%s'.formatted(new String[] {'blue', 1})"
val message = parser.parseExpression(expression).getValue(String::class.java)