使用Thymeleaf标准方言执行算术运算得到非预期结果问题
问题原因分析
这个差异是Thymeleaf标准方言默认使用的OGNL表达式引擎的运算规则和Thymeleaf自身的文本运算规则不一致导致的,具体如下:
- 测试2的表达式
${total - active}完整包裹在同一个${}块内,所有运算逻辑由OGNL引擎处理。OGNL的算术运算默认采用宽松的空值处理策略:会自动把null转换为浮点型0.0参与运算,不会触发空值异常,所以你会得到0.0 -7 = -7.0的结果。 - 测试3的表达式
${total} - ${active}中,减号不在${}内部,两个变量是分别由OGNL解析出值之后,交给Thymeleaf自身的运算逻辑处理。而Thymeleaf原生的算术运算对空值做严格校验,只要操作数存在null就会直接抛出异常,符合你预期的行为。
规避方案
如果想让测试2的场景也触发异常避免静默出错,可以采用下面的方案:
- 调整OGNL的配置,开启严格空值处理:禁用OGNL默认的null转0的逻辑,运算时遇到null直接抛出异常。
- 模板表达式中主动显式处理空值,比如给参数指定默认值:
<span th:text="${(total?:0) - (active?:0)}"></span>
- 后端填充Model时保证参与算术运算的参数非空,从数据源头上避免null值进入模板运算逻辑。
内容的提问来源于stack exchange,提问作者andrewJames
相关产品推荐
相关产品推荐

