Thymeleaf 3中th:unless代码块始终未执行,求解决建议
解决Thymeleaf 3中
th:unless代码块未执行的问题 针对你遇到的th:unless始终不执行的情况,我整理了几个实用的排查和解决方向:
先确认
products.productTypes的类型与实际值
Thymeleaf的表达式比较是强类型的,如果productTypes是字符串类型而非数字,直接和8、12做数值比较会不符合预期。你可以先在页面上临时输出这个属性的内容和类型,验证一下:<!-- 临时调试用,之后可以删除 --> <p>productTypes值: <span th:text="${products.productTypes}"></span></p> <p>productTypes类型: <span th:text="${#objects.getClass(products.productTypes)}"></span></p>如果确实是字符串,需要先转成数字再比较,修改后的条件如下:
<th:block th:if="${#numbers.integerValue(products.productTypes) gt 8 and #numbers.integerValue(products.productTypes) lt 12}"> <div th:replace="fragments/products/sub-granulates"/> </th:block> <th:unless="${#numbers.integerValue(products.productTypes) gt 8 and #numbers.integerValue(products.productTypes) lt 12}"> <div th:replace="fragments/products/sub-traditional-products"/> </th:block>简化表达式,排查逻辑优先级或语法问题
th:unless本质等价于th:if="${!(原条件)}",你可以把th:unless替换成反向的th:if试试,看是否能正常触发:<th:block th:if="${products.productTypes gt 8 and products.productTypes lt 12}"> <div th:replace="fragments/products/sub-granulates"/> </th:block> <th:block th:if="${!(products.productTypes gt 8 and products.productTypes lt 12)}"> <div th:replace="fragments/products/sub-traditional-products"/> </th:block>另外也可以拆分条件单独测试,比如先只判断
gt 8,看th:if和th:unless是否正常切换,逐步缩小问题范围。检查
products对象或productTypes属性是否为空
如果products是null,或者productTypes属性不存在,Thymeleaf的表达式会被判定为false,这会导致th:if不执行,但th:unless的反向条件也可能因为空值而不符合预期。建议在条件中先增加非空判断:<th:block th:if="${products != null and products.productTypes gt 8 and products.productTypes lt 12}"> <div th:replace="fragments/products/sub-granulates"/> </th:block> <th:unless="${products != null and products.productTypes gt 8 and products.productTypes lt 12}"> <div th:replace="fragments/products/sub-traditional-products"/> </th:block>尝试用
th:switch替代if/unless写法
换一种逻辑写法有时候能避开语法或优先级的坑,比如用th:switch结合#numbers.between工具方法,逻辑更直观:<th:block th:switch="${products != null ? products.productTypes : -1}"> <!-- between(a,b) 是判断是否在a到b之间(包含边界),对应gt8即>=9,lt12即<=11 --> <div th:case="${#numbers.between(productTypes, 9, 11)}" th:replace="fragments/products/sub-granulates"/> <!-- 默认匹配所有其他情况 --> <div th:case="*" th:replace="fragments/products/sub-traditional-products"/> </th:block>
内容的提问来源于stack exchange,提问作者Yvan Dupré
相关产品推荐
相关产品推荐

