es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Resultado inesperado al utilizar la aritmética de Thymeleaf.

Tengo una plantilla de Thymeleaf, sin utilizar Spring o SpEL, sólo el dialecto estándar de Thymeleaf.

La parte relevante de la plantilla es:

html
<div>
    <span>Inactive: </span>
    <span th:text="${total - active}"></span>
</div>

Prueba 1

Si se populó mi modelo de la siguiente manera:

java
model.put("total", 10);
model.put("active", 7);

Entonces obtengo el resultado esperado:

html
<div>
    <span>Inactive: </span>
    <span>3</span>
</div>

Prueba 2

Pero si uno (o ambos) de los valores del modelo es nulo:

java
model.put("total", null);
model.put("active", 7);

Entonces obtengo un resultado inesperado. Con los datos anteriores, obtengo:

html
<div>
    <span>Inactive: </span>
    <span>-7.0</span>
</div>

En otras palabras, el valor null se evalúa como el número decimal 0.0, y el resultado se calcula como -7.0.

Yo esperaba que arrojara un error en tiempo de ejecución, causado por intentar realizar aritmética sobre un valor nulo.

Prueba 3

Si cambio ligeramente la plantilla y utilizo los mismos datos que en la prueba 2:

html
<div>
    <span>Inactive: </span>
    <span th:text="${total} - ${active}"></span>
</div>

Obtengo el siguiente error en tiempo de ejecución, que es lo que esperaba para la prueba 2:

org.thymeleaf.exceptions.TemplateProcessingException: Cannot execute subtraction: operands are "null" and "7"

¿Por qué la prueba 2 genera HTML válido con un resultado de cálculo inesperado en lugar de arrojar un error?

(Entiendo que necesito manejar estos valores nulos de antemano para evitar problemas, pero esta falla silenciosa no es aceptable.)

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    La razón por la cual Test 2 genera HTML válida con un resultado de cálculo inesperado en lugar de lanzar un error es porque el dialecto estándar de Thymeleaf tiene soporte incorporado para la evaluación de expresiones nulas. En este caso, Thymeleaf trata el valor null como 0.0 porque está tratando la expresión como nula y, por lo tanto, devuelve un valor predeterminado de 0.0 en lugar de lanzar un error.

    Este comportamiento puede cambiarse desactivando la evaluación nula en la configuración, lo que causará que Thymeleaf lance una excepción en tiempo de ejecución al intentar realizar operaciones aritméticas con valores nulos. Sin embargo, se recomienda manejar estos valores nulos de antemano para evitar cualquier comportamiento inesperado.

Comments are closed.