java Sping Boot / Thymeleaf -循环中的循环

yquaqz18  于 2023-06-04  发布在  Java
关注(0)|答案(3)|浏览(185)

我有一个应用程序,其中有两个实体,它们具有双向的一对多关系。车主和自行车
所以通过curl得到所有者

[
    {"id":1,
    "userName":"user1",
    "bicycles":
        [
            {
                "id":1,
                "make":"dawes",
                "model":"civic",
                "owner":1
            }
        ]
    },
    {"id":2,
    "userName":"user2",
    "bicycles":
        [
            {
                "id":2,
                "make":"whyte",
                "model":"montpellier",
                "owner":2
            }
            ,{
                "id":4,
                "make":"dahon",
                "model":"tern A7",
                "owner":2
            }
        ]
    } ]

这没什么
如果我创建一个在表格中循环的模板,

<table>
    <tr th:each="owner : ${owners}">
      <td th:text="${owner.userName}"></td>
      <td th:text="${owner.bicycles[0].make}"
          th:if="${#lists.size(owner.bicycles)} > 0">"</td>
      <td th:text="${owner.bicycles[0].model}"
          th:if="${#lists.size(owner.bicycles)} > 0"></td> 
    </tr>
  </table>

然后我在浏览器中得到预期的结果。我知道上面的代码很糟糕,但我现在只想让thymeleaf工作。
但如果我执行以下代码

<table>
    <tr th:each="owner : ${owners}">
      <td th:text="${owner.userName}"></td>
      <tr th:each="bike : ${owner.bicycles}">
          <td th:text="${bike.make}"></td>
          <td th:text="${bike.model}"></td>  
      </tr>  
    </tr>
  </table>

然后我得到下面的控制台错误
嵌套异常为org.thymeleaf.exceptions。TemplateProcessingException:计算SpringEL表达式时出现异常:“owner.bicycles”(模板:“nutsthymeleaf”-第23行,第15栏)],并注明根本原因
org.springframework.expression.spel.SpelEvaluationException:EL 1007 E:在null上找不到属性或字段“bicycles”
我发现令人困惑的是,业主.自行车[索引]工作。上面有品牌和型号。然而,根据错误,owner.bicycles似乎是一个空字段。
很明显,我做错了什么……

gwo2fgha

gwo2fgha1#

所以我找到了这个
Thymeleaf: Getting Property or field cannot be found on null. Iteration of list inside a list
这就停止了SpelException。
玩过之后,它不需要3个级别,只需要两个。如果th:each嵌套在th:each中,则会出现问题。第二个th:each必须在th:块中(也可能是div)。

plicqrtu

plicqrtu2#

尝试if检查bicycles是否为 null

<table>
    <tr th:each="owner : ${owners}">
      <td th:text="${owner.userName}"></td>
      <tr th:if={owner.bicycles != null} th:each="bike : ${owner.bicycles}">
          <td th:text="${bike.make}"></td>
          <td th:text="${bike.model}"></td>  
      </tr>  
    </tr>
</table>
vs3odd8k

vs3odd8k3#

问题似乎是您试图通过嵌套表行<tr>元素来生成无效的HTML。
要生成您想要的HTML,您应该使用syntethic th:block标记,它允许您为每辆自行车生成单元格。

<table>
    <tr th:each="owner : ${owners}">
      <td th:text="${owner.userName}"></td>
      <th:block th:each="bike : ${owner.bicycles}">
          <td th:text="${bike.make}"></td>
          <td th:text="${bike.model}"></td>  
      </th:block>  
    </tr>
  </table>

相关问题