Manejo de valores nulos en Freemarker

Respuestas:

98

Puede utilizar el ??operador de prueba:

Esto verifica si el atributo del objeto no es nulo:

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

Esto verifica si el objeto o atributo no es nulo:

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

Fuente: FreeMarker Manual

Tom Verelst
fuente
1
¿Cuál es la diferencia entre este enfoque y has_content?
Anand B
3
has_content, junto a la comprobación de nulos, también comprueba si el valor no está vacío. Esto funciona para cadenas, secuencias, hashes o colecciones. Si el objeto es una fecha, un booleano o un número, entonces actúa como no vacío. Para todos los demás tipos, actuará como vacío.
Tom Verelst
Tengo este problema donde tengo que verificar si el valor en bean es nulo. Intenté lo siguiente: $ {checknull (Bean.getValue ())}, donde checknull si una función <#function checknull x> <#if x? ?> <#return ""> <#else> <#return x> </ # if> </ # function> pero obtengo "Error al ejecutar macro: checknull required parameter: x is not specified." error
Anand B
Tienes que revertir los retornos: <#function checknull x> <#if x ??> <#return x> <#else> <#return ""> </ # if> </ # function>
Tom Verelst
1
Verifique la respuesta a continuación: stackoverflow.com/a/27614219/3002336
Anand Varkey Philips
106

A partir de freemarker 2.3.7, puede utilizar esta sintaxis :

${(object.attribute)!}

o, si desea mostrar un texto predeterminado cuando el atributo es null:

${(object.attribute)!"default text"}
Arnaud
fuente
1
Para aquellos que están usando Freemarker como motor de plantilla para XDocReport, esto funciona después de agregarlo <dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.22</version></dependency>a su pom.xml.
Ludovic Guillaume
¿Cómo lo haces si tienes una fecha y la fecha podría ser nula? En otras palabras, object.dateAcquired donde dateAcquired podría ser nulo y tienes $ {object.dateAcquired? Date}
Stephane Grenier
1
@StephaneGrenier uso${(object.dateAcquired?date)!"not present"}
Tassos Bassoukos
1
Gran ejemplo. Me ayudo mucho. El soporte, sin embargo, está obsoleto. ${salutation!'Dear Mr. or Mrs.'}
Sim0rn
¿Alguna idea de cómo podría imprimir. Ahora? Largo en el valor predeterminado?
Santiago Aceñolaza
4

Creo que funciona al revés

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

Si object.attributeNO es NULO, se imprimirá el contenido.

Senthil Kumar Sekar
fuente
1

Utilice el ??operador al final de su <#if>estado de cuenta.

Este ejemplo demuestra cómo manejar nullvalores para dos listas en una plantilla de 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
fuente
-3

Si tiene muchas variables para convertir en opcionales, puede usar SubimeText con esto:

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

Asegúrese de que las opciones de expresiones regulares y que distingan mayúsculas de minúsculas estén habilitadas:

Sublime regex reemplazar

Juan Ignacio Barisich
fuente