当前位置: 首页 > 知识库问答 >
问题:

Spring引导/thymeleaf嵌套循环对象访问

廉飞捷
2023-03-14

我正在使用Spring Boot和Thymeleaf为我的应用程序创建一个登录页。为此,我需要呈现所有包含容器的主机对象的列表。以下是相关代码:

public class Container {
    private String name;
    private String baseUrl;
    private String status;

    public Container(String name, String baseUrl, String status) {
        this.name = name;
        this.baseUrl = baseUrl;
        this.status = status;
    }

    public String getName() { return name; }
    public String getBaseUrl() { return baseUrl; }
    public String getStatus() { return status; }
}

public class Host {
    private HashMap<String, Container> containers;
    ....
    public List<Container> getContainers() {
         return containers.values();
    }
}

@RequestMapping("/")
public class IndexController {
      @RequestMapping("/")
      public String getIndex(Model model) {
          model.addAttribute("hosts", hostRepository.getAllServers());
          return "index";
      }
}

现在,我想遍历所有服务器,并在表中显示关于每个容器的信息。我的Thymeleaf模板如下所示:

<div class="panel panel-default" th:each="host : ${hosts}">
            <div class="panel-heading">
                <b th:text="${host.name}">Host X</b>
                <div class="panel-body">
                    <table class="table">
                        <thead>
                            <tr>
                                <th>Name</th>
                                <th>URL</th>
                                <th>Status</th>
                            </tr>
                        </thead>
                        <tbody>
                            <tr th:each="container : ${host.getContainers()}">
           <!-- HERE IS THE PROBLEM -->
                                <td th:text="${container.name}">Service1</td>
                                <td th:text="${container.baseUrl}">domain.com/api/url</td>
                                <td th:text="${container.status}">RUNNING</td>
           <!-- HERE ENDS THE PROBLEM -->
                            </tr>
                        </tbody>
                    </table>
                </div>
            </div>
</div>

我的问题是访问容器属性的部分(由注释标记)。每次我都会得到一个SpringEL异常。如果我删除th: text="${container.xy}"并将其替换为th: text="${容器}会显示容器的String版本,因此我可以访问对象和它正常工作的循环。我还尝试用getters替换字段访问(例如getstatus()),但它也不起作用。

谢谢你的帮助。如果你需要更多信息,请随时询问。

设置:

  • Java 8
  • Spring Boot Starter Web
  • 百里香叶

编辑:引发的异常为:嵌套异常为org。特里梅莱夫。例外情况。TemplateProcessingException:异常评估SpringEL表达式:“container.name”(索引:35),其中索引:35是第一个有问题的行。

使用${container}时的toString()输出是jenkins=com。我的应用程序。Container@7552c269jenkins是容器实例的属性。

解决方案似乎嵌套循环是在映射而不是列表上迭代。将${container.xy}更改为${container.getValue().xy}解决了这个问题。

共有1个答案

冯翔
2023-03-14

溶液

看起来嵌套循环正在一个组织上迭代。特里梅莱夫。util。EvaluationUtil$MapEntry,而不是列表。将${container.xy}更改为${container.getValue().xy}解决了这个问题。

一路上学到的一点:

  • 重写toString()方法以获取有关迭代对象的格式化信息。在这种情况下,输出是键=值,这是预期的。这提示当前对象必须不是容器实例
  • 查看Thymeleaf的堆栈跟踪(通常是指某个内容为null或非公共的提示)
  • 在迭代过程中对当前对象使用getClass(),检查此处是否出错
 类似资料:
  • 尝试使用所有独特的硬币进行选择过滤器,但无法正确到达其末尾。 在循环浏览数据时,我可以得到所有硬币的列表。 我还想使用Set方法和spread操作符来获得唯一的值,但我不知道如何组合所有这些。

  • 我用的是angular 5。我尝试在下面的html数组中使用嵌套循环 对象: HTML: 我得到以下解析错误: 我在app.module.ts导入了BrowserModul和Common Modul,这样用户就可以将一周中的任何一天的时间表复制到一周的其余时间。 编辑:我的代码中的实际超文本标记语言:

  • Python 不仅支持 if 语句相互嵌套,while 和 for 循环结构也支持嵌套。所谓嵌套(Nest),就是一条语句里面还有另一条语句,例如 for 里面还有 for,while 里面还有 while,甚至 while 中有 for 或者 for 中有 while 也都是允许的。 当 2 个(甚至多个)循环结构相互嵌套时,位于外层的循环结构常简称为 外层循环或 外循环,位于内层的循环结构常简

  • 这是我的代码。我遇到的问题是,我希望将HP在我的PHP代码中的数字转换为我的HP HTML代码,以及与Cylinder相同的内容。我已经想好了其他的东西,但说到这一部分我就卡住了

  • 本文向大家介绍MATLAB嵌套循环,包括了MATLAB嵌套循环的使用技巧和注意事项,需要的朋友参考一下 示例 可以嵌套循环,以在另一个迭代任务中执行迭代任务。考虑以下循环: 我们使用2个迭代器来显示abc和中元素的所有组合1:m,从而得出: 我们还可以使用嵌套循环来组合每次要完成的任务和几次迭代中要完成的任务: 这里我们要计算所有的斐波那契数列,但是n每次只显示第一个元素,所以我们得到 我们可以做

  • 嵌套循环就是在一个循环中还有一个循环,内部循环在外部循环体中.在外部循环的每次执行过程中都会触发内部循环,直到内部循环执行结束.外部循环执行了多少次,内部循环就完成多少次.当然,不论是外部循环或内部循环的break语句都会打断处理过程. 例子 10-19. 嵌套循环 1 #!/bin/bash 2 # nested-loop.sh: 嵌套的"for" 循环. 3 4 out