2016-11-11 9 views
0

私はSpringブートとThymeleafを使用して、 私のアプリケーション用の1つのランディングページを作成しています。このためには、すべての にコンテナが含まれているホストオブジェクトのリストをレンダリングする必要があります。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="${container}に置き換えると、オブジェクトへのアクセス権とループが正しく機能するように、文字列型のコンテナが表示されます。フィールドアクセスをgetter(たとえばgetStatus())に置き換えようとしましたが、これも機能しません。

ありがとうございました。より多くの情報が必要な場合は、お気軽にお問い合わせください。

セットアップ:

  • のJava 8
  • 春ブーツスターターウェブ
  • Thymeleaf

編集:例外がスローされます。35最初の問題の行です:インデックスはnested exception is org.thymeleaf.exceptions.TemplateProcessingException: Exception evaluating SpringEL expression: "container.name" (index:35)

${container}を使用するときのtoString()出力は[email protected]で、jenkinsはContainerインスタンスのname属性です。

解決策ネストされたループがリストの代わりにマップを反復しているように見えました。 ${container.xy}から${container.getValue().xy}に変更すると問題が解決しました。

+0

** **例外は何ですか?これは、 '.xy'をドロップしたときに正しい' toString'出力が得られれば、SpEL式にタイプミスがある可能性が最も高いと言えます。 – chrylis

+0

$ {host.getContainer()}は$ {host.getContainers()}にする必要があります。 –

+0

@TommySchmidtクラス内のタイプミスを修正しました。 – teekay

答えて

2

ソリューション

ネストされたループではなく、リストのorg.thymeleaf.util.EvaluationUtil$MapEntryを反復していることseemes。 ${container.xy}から${container.getValue().xy}に変更すると問題が解決しました。

ビットは、道に沿って学習した:

  • オーバーライドtoString()方法は、反復処理オブジェクトに関するフォーマット情報を取得します。この場合、出力はkey=valueであり、これはvalueと予想された。これは、現在のオブジェクトが、中に現在のオブジェクトのインスタンスContainer以外の何か
  • Thymeleafのスタックトレースを見(何かが公共nullかではないことを、通常はそのヒント)
  • 使用getClass()でなければならないというヒントを与えましたここで何か問題が発生したかどうかを確認する反復
関連する問題