【问题标题】:Freemarker template error: null or missingFreemarker 模板错误:null 或缺失
【发布时间】:2017-05-30 15:56:35
【问题描述】:
public static void main(String[] args) throws IOException {
    port(8080);

    Configuration config  = new Configuration(Configuration.VERSION_2_3_26);
    config.setDirectoryForTemplateLoading(new File("PATH_NAME"));



    get("/test", (req,res) ->{
        StringWriter writer = new StringWriter();
        Template temp = config.getTemplate("loginform.ftl");
        temp.process(null, writer);
        return writer;
    });


    post("/select", (req,res) -> {
        String city = req.queryParams("city");
        String state = req.queryParams("state");


        Map<String, Object> data = new HashMap<>();

        data.put("Hello", "Your not null!");

        StringWriter writer = new StringWriter();
        Template temp = config.getTemplate("result.ftl");

        temp.process(data, writer);

        return writer;

        });

}

以上是我正在开发的 Spark 应用程序的主要方法。它涉及两个模板,loginform.ftl 和 result.ftl。 Loginform.ftl 是一个简单的 html 表单,它向服务器发送一个 post 请求,由上面代码中的 post 处理程序处理。当我填写表格并发送请求时,我收到 500 内部服务器错误。该错误与我现在用来测试模板制作的 result.ftl 有关。我将 HashMap 传递给 result.ftl 模板。我得到的错误是:

FreeMarker template error:
The following has evaluated to null or missing:
==> data  [in template "result.ftl" at line 2, column 8]


FTL stack trace ("~" means nesting-related):
    - Failed at: #list data as key, value  [in template "result.ftl" at line 
2, column 1]
---- 

我认为这意味着在生成模板时数据为空,但很明显不是。我不知道这正在发生。我的模板文件如下。
登录表单.ftl

<form action= "/select" method= "POST" accept-charset="utf-8">

  City Name: <input type= "text"  name = "city">

  State(2 letter format):<input type= "text"  name = "state">

 <input type= "submit" id = "submitButton">

</form>

结果.ftl

<html>
  <#list data as key, value>
    ${key} = ${value};
  </#list>
</html>

【问题讨论】:

    标签: java rest templates freemarker spark-framework


    【解决方案1】:

    错误信息是正确的。在您的 Java 代码中,data 用作数据模型根。根本身不是顶级变量,而是顶级变量的容器。因此,例如${Hello} 会起作用,并打印“Your not null!”。 (另请注意,“data”只是一个局部变量名,在 Java 编译期间已消失,并且您永远不会将“data”变量名传递给 FreeMarker。)所以你应该创建一个 root Map (或 bean) ,将dataMap(或bean)放入其中,并将root传递给Template.process

    更新:也就是说,现在你有temp.process(data, writer);,你应该有:

    Map<String, object> root = new HashMap<>();
    root.put("data", data);
    
    temp.process(root, writer);
    

    【讨论】:

    • 但是当我尝试对地图数据中的所有键进行排序时,这对我有帮助吗?列表属性是否仍只会遍历数据映射中的键和值?
    • 好吧,你有&lt;#list data ...&gt;,如果不是data,它还会列出什么?我注意到混乱来自哪里。也许你认为“数据”这个名字很特别?它不是。它可以是“苹果”或任何东西。您可以在根Map 中拥有任意数量的Map-s(和List-s、String-s 等),当然每个名称都不同。
    • 没关系。我知道了。我会在几秒钟内发布答案。
    猜你喜欢
    • 2016-02-29
    • 2016-06-18
    • 2021-12-22
    • 2017-09-15
    • 2016-11-09
    • 2016-07-07
    • 2019-07-08
    • 1970-01-01
    • 2015-02-27
    相关资源
    最近更新 更多