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


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"}

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.


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>

-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ń

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.