Varargs Invocations
The Spring Expression Language supports varargs invocations for constructors, methods, and user-defined functions.
The following example shows how to invoke the java.lang.String#formatted(Object…)
varargs method within an expression by supplying the variable argument list as separate
arguments ('blue', 1
).
-
Java
-
Kotlin
// 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)
A variable argument list can also be supplied as an array, as demonstrated in the
following example (new Object[] {'blue', 1}
).
-
Java
-
Kotlin
// 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)
As an alternative, a variable argument list can be supplied as a java.util.List
– for
example, as an inline list
({'blue', 1}
). The following example shows how to do that.
-
Java
-
Kotlin
// 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 Type Conversion
In contrast to the standard support for varargs invocations in Java, type conversion may be applied to the individual arguments when invoking varargs constructors, methods, or functions in SpEL.
For example, if we have registered a custom
function in the EvaluationContext
under the name #reverseStrings
for a method with the signature
String reverseStrings(String… strings)
, we can invoke that function within a SpEL
expression with any argument that can be converted to a String
, as demonstrated in the
following example.
-
Java
-
Kotlin
// 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)
Similarly, any array whose component type is a subtype of the required varargs type can
be supplied as the variable argument list for a varargs invocation. For example, a
String[]
array can be supplied to a varargs invocation that accepts an Object…
argument list.
The following listing demonstrates that we can supply a String[]
array to the
java.lang.String#formatted(Object…)
varargs method. It also highlights that 1
will be automatically converted to "1"
.
-
Java
-
Kotlin
// 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)