ThymeLeaf 片段在错误 th:if 上执行

Posted

技术标签:

【中文标题】ThymeLeaf 片段在错误 th:if 上执行【英文标题】:ThymeLeaf Fragment executed on false th:if 【发布时间】:2017-04-28 23:31:53 【问题描述】:

我正在使用与 Spring-Boot 一起打包的 Thymeleaf。这是主要模板:

<div class="container">
    <table th:replace="fragments/resultTable" th:if="$results">
        <tr>
            <th>Talent</th>
            <th>Score</th>
        </tr>
        <tr>
            <td>Confidence</td>
            <td>1.0</td>
        </tr>
    </table>
</div>

它使用了这个片段:

<table th:fragment="resultTable">
    <tr>
        <th>Talent</th>
        <th>Score</th>
    </tr>
    <tr th:each="talent : $talents">
        <td th:text="$talent">Talent</td>
        <td th:text="$results.getScore(talent)">1.0</td>
    </tr>
</table>

片段仅在有结果对象时才有效。这对我来说很有意义。因此,基于documentation 的语法,我将th:if 语句添加到主模板文件中。但是,当我在没有对象的情况下访问模板时仍然出现此错误

Attempted to call method getScore(com.model.Talent) on null context object

th:if 语句不应该阻止该代码被访问吗?

填充结果对象后,模板仍然可以正常工作,但是如何在没有表格的情况下呈现 null 情况?

【问题讨论】:

如何在片段本身内添加一个空检查 你的意思是如果 condition1 != null 和 condition2 = 什么?见:***.com/questions/31524073/… 【参考方案1】:

使用 Thymeleaf 3.0,您可以使用无操作令牌仅在满足条件时插入/替换,如下所示:

<table th:replace="$results ? ~fragments :: resultTable : _">

https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html#advanced-conditional-insertion-of-fragments

【讨论】:

【参考方案2】:

片段包含的运算符优先级高于 th:if。

http://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf.html#attribute-precedence

您可能必须将 th:if 移动到上面的标记中。在容器 div 中,或者如果您仍然需要容器 div,则 th:block 像这样:

<div class="container">
    <th:block th:if="$results">
        <table th:replace="fragments/resultTable">
            <tr>
                <th>Talent</th>
                <th>Score</th>
            </tr>
            <tr>
                <td>Confidence</td>
                <td>1.0</td>
            </tr>
        </table>
    </th:block>
</div>

【讨论】:

以上是关于ThymeLeaf 片段在错误 th:if 上执行的主要内容,如果未能解决你的问题,请参考以下文章

如何在 th:if 标记中使用 thymeleaf 有多个条件

Thymeleaf th:each 用 th:if 过滤

Thymeleaf 迭代,if,switch语法

thymeleaf-标签th:if

Spring Boot thymeleaf 错误请求 400 而不是显示用户错误

Thymeleaf 条件语句