Clarify behavior of the Elvis SpEL operator in documentation (#30352)

This commit improves both the javadoc and the reference guide section on
the Elvis SpEL operator to clarify that in addition to `null` objects,
empty Strings also lead the operator to evaluate to its second operand.

The reference guide's advanced snippet is modified to use such an empty
String instead of `null` to make that behavior prominent with some code.

See gh-30318
Closes gh-30352
This commit is contained in:
Simon Baslé
2023-05-05 16:13:06 +02:00
committed by GitHub
parent f2c0b30641
commit d3c3088c6b
2 changed files with 11 additions and 7 deletions

View File

@@ -38,6 +38,10 @@ Kotlin::
----
======
NOTE: The SpEL Elvis operator also checks for _empty_ Strings in addition to `null` objects.
The original snippet is thus only close to emulating the semantics of the operator (it would need an
additional `!name.isEmpty()` check).
The following listing shows a more complex example:
[tabs]
@@ -53,7 +57,7 @@ Java::
String name = parser.parseExpression("name?:'Elvis Presley'").getValue(context, tesla, String.class);
System.out.println(name); // Nikola Tesla
tesla.setName(null);
tesla.setName("");
name = parser.parseExpression("name?:'Elvis Presley'").getValue(context, tesla, String.class);
System.out.println(name); // Elvis Presley
----
@@ -69,7 +73,7 @@ Kotlin::
var name = parser.parseExpression("name?:'Elvis Presley'").getValue(context, tesla, String::class.java)
println(name) // Nikola Tesla
tesla.setName(null)
tesla.setName("")
name = parser.parseExpression("name?:'Elvis Presley'").getValue(context, tesla, String::class.java)
println(name) // Elvis Presley
----

View File

@@ -26,9 +26,9 @@ import org.springframework.util.Assert;
import org.springframework.util.ObjectUtils;
/**
* Represents the elvis operator <code>?:</code>. For an expression <code>a?:b</code> if <code>a</code> is not null,
* the value of the expression is <code>a</code>, if <code>a</code> is null then the value of the expression is
* <code>b</code>.
* Represents the Elvis operator <code>?:</code>. For an expression <code>a?:b</code> if <code>a</code> is neither null
* nor an empty String, the value of the expression is <code>a</code>.
* If <code>a</code> is null or the empty String, then the value of the expression is <code>b</code>.
*
* @author Andy Clement
* @author Juergen Hoeller
@@ -43,8 +43,8 @@ public class Elvis extends SpelNodeImpl {
/**
* Evaluate the condition and if not null, return it.
* If it is null, return the other value.
* Evaluate the condition and if neither null nor an empty String, return it.
* If it is null or an empty String, return the other value.
* @param state the expression state
* @throws EvaluationException if the condition does not evaluate correctly
* to a boolean or there is a problem executing the chosen alternative