2016-11-11 8 views
0

Ich benutze Spring Boot und Thymoleaf, um eine einzige Zielseite für meiner Anwendung zu erstellen. Dazu muss ich eine Liste von Host-Objekten rendern, die alle einen Container enthalten. Hier ist der entsprechende Code:Spring Boot/thymeleaf geschachtelt Schleife Objekt Zugriff

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"; 
     } 
} 

Jetzt möchte ich alle Server iterieren und zeigt die Informationen über die einzelnen Container in einer Tabelle. Meine Thymeleaf Vorlage sieht wie folgt aus:

<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> 

Mein Problem ist, ist der Teil, wo die Eigenschaften des Behälters Zugriff (durch den Kommentar markiert). Jedes Mal, wenn ich eine SpringEL Exception bekomme. Wenn ich die th:text="${container.xy}" entferne und sie durch th:text="${container} ersetzt, wird eine String-Version des Containers angezeigt, so dass ich Zugriff auf das Objekt und die Schleife habe, die es richtig funktioniert. Ich habe auch versucht, den Feldzugriff durch Getter zu ersetzen (z. B. getStatus()), aber es funktioniert auch nicht.

Danke für Ihre Hilfe. Wenn Sie mehr Informationen benötigen, zögern Sie nicht zu fragen.

Setup:

  • Java 8
  • Frühlings-Boot-Starter Web
  • Thymeleaf

bearbeiten: Die geworfene Ausnahme ist: nested exception is org.thymeleaf.exceptions.TemplateProcessingException: Exception evaluating SpringEL expression: "container.name" (index:35) wo Index: 35 die erste problematische Zeile ist .

Die Ausgabe toString() bei Verwendung von ${container} ist [email protected] und jenkins ist das name Attribut der Container-Instanz.

Lösung Es schien, dass die verschachtelte Schleife über eine Map statt über eine List iterierte. Die Änderung ${container.xy} zu ${container.getValue().xy} löste das Problem.

+0

** Was ** Ausnahme?Dies bedeutet höchstwahrscheinlich, dass Sie einen Tippfehler in Ihrem SPEL-Ausdruck haben, wenn Sie eine korrekte 'toString'-Ausgabe erhalten, wenn Sie' .xy' weglassen. – chrylis

+0

$ {host.getContainer()} sollte $ {host.getContainers()} sein –

+0

@TommySchmidt In der Klasse einen Tippfehler gemacht, das behoben. – teekay

Antwort

2

Lösung

Es seemes, dass die verschachtelte Schleife eine über org.thymeleaf.util.EvaluationUtil$MapEntry anstelle einer Liste iteriert wurde. Die Änderung ${container.xy} zu ${container.getValue().xy} löste das Problem.

Bits gelernt auf dem Weg:

  • Aufschalten der toString() Methode formatiert Informationen über das Objekt zu erhalten iterieren. In diesem Fall war die Ausgabe key=value, obwohl value erwartet wurde. Dies ergab einen Hinweis darauf, dass das aktuelle Objekt etwas anderes als eine Container Instanz sein muss
  • Blick auf dem Stack-Trace von Thymeleaf (in der Regel sein ein Hinweis darauf, dass etwas null oder nicht öffentlich ist)
  • Verwenden getClass() auf dem aktuellen Objekt während der Iteration, um zu überprüfen, ob hier etwas schief gelaufen ist
Verwandte Themen