0

ネストされたマップがあります。

Map<String, Map<String, Long>> domains;

次の方法でアクセスすると、InvalidReferenceException が発生します

<#list somelist as item>
  <#list domains[item]?keys as key>
    ${key}
  </#list>
</#list>

式ドメイン[アイテム] は行上で定義されていません...

BeansWrapper と DefaultObjectWrapper を使ってみました。また、マップの内容を確認しましたが、null の値はありません。

4

1 に答える 1

1

との両方DefaultObjectWrapperで動作するので、いくつかの悪いキーが含まれているBeansWrapperと思います。somelist

これが私が使用したテストコードです。test.ftl次のクラスと同じディレクトリにテンプレートを配置します。

package adhoc;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import freemarker.ext.beans.BeansWrapper;
import freemarker.template.Configuration;
import freemarker.template.TemplateException;

public class TestTemplateRunner {

    public static void main(String[] args) throws FileNotFoundException, IOException, TemplateException {
        Configuration cfg = createConfiguration(false);

        cfg.getTemplate("test.ftl").process(
                createDataModel(),
                new OutputStreamWriter(System.out));
    }

    private static Configuration createConfiguration(boolean useBeansWrapper) {
        Configuration cfg = new Configuration();
        cfg.setClassForTemplateLoading(TestTemplateRunner.class, "");
        if (useBeansWrapper) {
            BeansWrapper bw = new BeansWrapper();
            bw.setSimpleMapWrapper(true);
            cfg.setObjectWrapper(bw);
        }
        return cfg;
    }

    private static Map<String, Object> createDataModel() {
        Map<String, Object> dataModel = new HashMap<String, Object>();

        Map<String, Map<String, Long>> domains = new HashMap<String, Map<String, Long>>();
        dataModel.put("domains", domains);

        Map<String, Long> domain1Hits = new HashMap<String, Long>();
        domain1Hits.put("/index", 1234L);
        domain1Hits.put("/about", 123L);
        domains.put("site1.com", domain1Hits);

        Map<String, Long> domain2Hits = new HashMap<String, Long>();
        domain2Hits.put("/", 2234L);
        domain2Hits.put("/contact", 223L);
        domains.put("site2.com", domain2Hits);

        List<String> somelist = new ArrayList<String>();
        somelist.add("site1.com");
        somelist.add("site2.com");
        dataModel.put("somelist", somelist);

        return dataModel;
    }

}
于 2013-03-16T10:21:54.663 に答える