我正在使用Spring Boot和Thymeleaf为其创建单个登录页面 我的应用程序。为此,我需要渲染一个所有的Host对象列表 包含一个容器。 以下是相关代码:
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";
}
}
现在我想迭代所有服务器并在表中显示有关每个Container的信息。 我的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="${container}
,则会显示容器的字符串版本,以便我可以访问该对象并使其正常工作。我还尝试用getter替换字段访问(例如getStatus()
),但它也不起作用。
感谢您的帮助。如果您需要更多信息,请随时提出。
设定:
编辑:抛出的异常是:nested exception is org.thymeleaf.exceptions.TemplateProcessingException: Exception evaluating SpringEL expression: "container.name" (index:35)
其中index:35是第一个有问题的行。
使用${container}
时的toString()输出是jenkins=com.my.app.Container@7552c269
,而jenkins是Container实例的name
属性。
解决方案嵌套循环似乎是迭代Map而不是List。将${container.xy}
更改为${container.getValue().xy}
解决了这个问题。
答案 0 :(得分:2)
解决方案
它表明嵌套循环正在迭代org.thymeleaf.util.EvaluationUtil$MapEntry
而不是List。将${container.xy}
更改为${container.getValue().xy}
解决了这个问题。
沿途学到的比特:
toString()
方法以获取有关迭代对象的格式化信息。在这种情况下,输出为key=value
,预计会有value
。这提示当前对象必须是Container
实例getClass()
以检查是否出现问题