Obsługa wartości null w Freemarker

Odpowiedzi:

98

Możesz użyć ??operatora testu:

Sprawdza, czy atrybut obiektu nie jest pusty:

<#if object.attribute??></#if>

Sprawdza, czy obiekt lub atrybut nie jest pusty:

<#if (object.attribute)??></#if>

Źródło: Podręcznik FreeMarker

Tom Verelst
źródło
1
Jaka jest różnica między tym podejściem a has_content?
Anand B,
3
has_content, obok sprawdzania wartości null, sprawdza również, czy wartość nie jest pusta. Działa to w przypadku ciągów, sekwencji, skrótów lub kolekcji. Jeśli obiekt jest datą, wartością logiczną lub liczbą, to zachowuje się jak niepusty. W przypadku wszystkich innych typów będzie działać jako pusty.
Tom Verelst,
Mam ten problem, w którym muszę sprawdzić, czy wartość w ziarnie ma wartość null. Próbowałem: $ {checknull (Bean.getValue ())}, gdzie checknull, jeśli funkcja <#function checknull x> <#if x? ?> <#return ""> <#else> <#return x> </ # if> </ # function> ale otrzymuję komunikat „Błąd podczas wykonywania makra: checknull wymagany parametr: nie określono x”. błąd
Anand B,
Musisz odwrócić zwroty: <#function checknull x> <#if x ??> <#return x> <#else> <#return ""> </ # if> </ # function>
Tom Verelst
1
Sprawdź poniższą odpowiedź: stackoverflow.com/a/27614219/3002336
Anand Varkey Philips
106

Począwszy od freemarker 2.3.7, możesz użyć następującej składni :

${(object.attribute)!}

lub, jeśli chcesz wyświetlić domyślny tekst, gdy atrybut to null:

${(object.attribute)!"default text"}
Arnaud
źródło
1
Dla tych, którzy używają Freemarkera jako silnika szablonów dla XDocReport, działa to po dodaniu <dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.22</version></dependency>do twojego pom.xml.
Ludovic Guillaume
Jak to zrobić, jeśli masz datę, a data może być zerowa? Innymi słowy object.dateAcquired, gdzie dateAcquired może być null i masz $ {object.dateAcquired? Date}
Stephane Grenier
1
@StephaneGrenier use${(object.dateAcquired?date)!"not present"}
Tassos Bassoukos
1
Świetny przykład. Bardzo mi pomogło. Wspornik jest jednak przestarzały. ${salutation!'Dear Mr. or Mrs.'}
Sim0rn
Każdy pomysł, jak mogę wydrukować. Teraz? Długo na domyślnej wartości?
Santiago Aceñolaza
4

Myślę, że to działa w drugą stronę

<#if object.attribute??>
   Do whatever you want....
</#if>

Jeśli object.attributeNIE jest NULL, zawartość zostanie wydrukowana.

Senthil Kumar Sekar
źródło
1

Użyj ??operatora na końcu <#if>wyciągu.

Ten przykład pokazuje, jak obsługiwać nullwartości dla dwóch list w szablonie Freemaker.

List of cars:
<#if cars??>
    <#list cars as car>${car.owner};</#list>
</#if>
List of motocycles:
<#if motocycles??>
    <#list motocycles as motocycle>${motocycle.owner};</#list>
</#if>
Daniel Perník
źródło
-3

Jeśli masz wiele zmiennych do konwersji na opcjonalne, możesz użyć SubimeText z tym:

Find: \${([A-Za-z_0-9]*)}
Replace: \$\{${1}!\}

Upewnij się, że są włączone opcje wyrażeń regularnych i wielkości liter:

Sublime regex zamień

Juan Ignacio Barisich
źródło