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


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

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.


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>

-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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.