spring boot / thymeleaf嵌套循环对象访问

时间:2016-11-11 16:13:42

标签: java spring-boot thymeleaf

我正在使用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()),但它也不起作用。

感谢您的帮助。如果您需要更多信息,请随时提出。

设定:

  • Java 8
  • Spring Boot Starter Web
  • Thymeleaf

编辑:抛出的异常是: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}解决了这个问题。

1 个答案:

答案 0 :(得分:2)

解决方案

它表明嵌套循环正在迭代org.thymeleaf.util.EvaluationUtil$MapEntry而不是List。将${container.xy}更改为${container.getValue().xy}解决了这个问题。

沿途学到的比特:

  • 重写toString()方法以获取有关迭代对象的格式化信息。在这种情况下,输出为key=value,预计会有value。这提示当前对象必须是Container实例
  • 以外的其他对象
  • 查看Thymeleaf的堆栈跟踪(通常暗示某些内容为null或不公开)
  • 在迭代过程中对当前对象使用getClass()以检查是否出现问题