2016-06-13 31 views
0

List<Map<String, List<Map<String, String>>>>を繰り返してすべての内容を印刷する必要があります。Freemarker - ネストされたマップとネストされたリストを反復する

私の問題は、地図のブラケット構文(like in the documentation)を入れ子にしたレベルで使用するたびに構文の問題があることです。 List<Map<String, List<Map<String, String>>>>のようなタイプのネストされたレベルを処理する方法を教えてください。

私は、このテストしている:

<!-- List<Map<String, List<Map<String, String>>>> --> 
<#list myList as map1> 

    <!-- Map<String, List<Map<String, String>>> --> 
    <#list map1?keys as key1> 
     My Key: ${key1} 

     <!-- List<Map<String, String>> --> 
     <#list map1[key1] as map2> 


      <!-- Map<String, String> --> 
      <#list map2?keys as key2> 
       My Key: ${key2} | My Value: ${map2[key2]} 
      </#list> 
     </#list> 
    </#list> 
</#list> 

をそして、私はこのエラーを持っている:

java.lang.RuntimeException: freemarker.core.InvalidReferenceException: The following has evaluated to null or missing: 
==> map1[key1] [in template "hello.html" at line 39, column 32] 

---- 
Tip: It's the final [] step that caused this error, not those before it. 
---- 
Tip: If the failing expression is known to be legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? 
---- 

---- 
FTL stack trace ("~" means nesting-related): 
    - Failed at: #list map1[key1] as map2 [in template "hello.html" at line 39, column 25] 
---- 

私はFreemarkerの2.3.23を使用しています。ありがとう。

+0

あなたが非稼働テンプレートスニペットを引用することはできますか? – ddekany

+0

作業中のテンプレートのスニペットでトピックを更新しました:) – Gugelhupf

+0

'key1'の値が何であるか確認しましたか? – ddekany

答えて

0

タイトルとしての回答を共有することは非常に一般的ですが、ユーザーはしばしば解決策を探してここに着陸することができます。フォーカスデータ型がListであり、データのリストがキーにmyListのテンプレートに記載されているものと同じマップに追加されていても、入力がMapであることに注意してください。これは、以下に引用ライブラリ要件ごとに行く -

Generally, you want to use a Map or a JavaBean as the root-map (aka. data-model) parameter. The Map key-s or JavaBean property names will be the variable names in the template.

public static void main(String[] args) { 
     Map<String, Object> input = new HashMap<String, Object>(); 
     List<Map<String, List<Map<String, String>>>> l1 = new ArrayList<>(); 
     Map<String, List<Map<String, String>>> m1 = new HashMap<>(); 
     List<Map<String, String>> l2 = new ArrayList<Map<String,String>>(); 
     Map<String, String> m2 = new HashMap<String, String>(); 

     m2.put("m2", "m2v"); 
     l2.add(m2); 
     m1.put("m1", l2); 
     l1.add(m1); 
     input.put("myList", l1); 

     System.out.println(l1); 

     Configuration cfg = new Configuration(); 
     try{ 
      FileTemplateLoader ftl = new FileTemplateLoader(new File("C:\\temp")); 
      cfg.setTemplateLoader(ftl); 
      Template temp = cfg.getTemplate("aa.ftlh"); 
      temp.process(input, new OutputStreamWriter(System.out)); 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 
+0

まあ、ありがとうが、これは私の質問に答えていない、私はマップの複雑なリストでFreeMarkerのテンプレートの例を探していた。 – Gugelhupf

+0

私が共有したコードは、あなたが質問で提供したテンプレートで動作します。それは助けてくれませんか? –

+0

FreeMarkerテンプレートコードが機能しないため、共有するコードはJavaコードです。私はFreeMarkerテンプレートコードを探しています。 – Gugelhupf

関連する問題