Here are some requests for null support in Velocity. Here is the discussion about this on the developer list.
The word "null" should be treated as null in Velocity specific content
For example:
#set ($list = ["one", null, "three"])
should make a 3 element list, with the elements "one", null and "three".
$foo.bar(null)
should call the "bar" method of the "foo" object with a null parameter.
Workarounds
- An unreferenced reference is treated as null, so
and
#set ($list = ["one", $somevariablenamethatneverwillbeused, "three"])
will do as the above.$foo.bar($somevariablenamethatneverwillbeused)
The "if" directive should be able to compare references with null
For example:
#if ($foo == null) foo is null #end
should output
foo is null
if foo was not in the Context.
#if ($foo != null) foo is not null #end
should output
foo is not null
if foo was in the Context.
Workarounds
- Using IfNullDirective / IfNotNullDirective
and
#ifnull ($foo) foo is null #end
will do as the above.#ifnotnull ($foo) foo is not null #end
- Many others are listed at CheckingForNull.
The "set" directive should accept null value as the RHS.
For example:
Assuming that $bar wasn't in the Context,
#set ($foo = $bar) #set ($foo = null)
should both remove "foo" from the Context, and
#set($map.foo = $bar) #set($map.foo = null)
should both set the "foo" property of "$map" to null.
Workarounds
- Setting null by invoking Context#remove(), or setter methods with null. Assuming that the Context was $ctx,
$ctx.remove("foo") $map.put("foo", $bar) $map.setFoo(null)
- Using the NullTool / ViewNullTool.
will do as the above. Note: NullTool can't set properties to null.
$null.setNull("foo")
- Bugzilla #20999 contains a patch to give this behaviour.
- It is also stated in bugzilla that you can achieve this by using the EventCartridge, but I can't figure out how. I'm hoping somebody will post a code snipplet for us.
The "foreach" directive should set null when the element is null
Currently, it preserves the last element.
For example:
#set ($list = ["one", null, "three"]) #foreach ($foo in $list) $!foo #end
should output:
one three
Workarounds
- Using the NullTool / ViewNullTool.
will do as the above.
#foreach ($foo in $list) $!foo $null.setNull("foo") #end
- Bugzilla #27741 contains a patch to give this behaviour.
null and the empty string should be totally equivalent
Comment from Nathan about the null keyword and the if directive support:
-0 i'm not totally against it, but i'm instinctively uncomfortable with using this programming concept in a template language. personally, i've always felt in a display-oriented language, null and the empty string should be totally equivalent. but that is already not the case, so i can't really be -1 on this.