天道酬勤,学无止境

Freemarker template error: null or missing

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;

        });

}

Above is the main method to the Spark application i am developing. It involves two templates, loginform.ftl and result.ftl. Loginform.ftl is a simple html form that sends a post request to the server which handled by the post handler in the code above. When I fill out the form and send the request, i get a 500 internal server error. The error relates to the result.ftl which, right now, i am using to test template making. I am passing a HashMap to the result.ftl template. The error i get is:

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

I took this to mean that data was null when the template was being generated , but it very clearly isn't. I have no idea this is happening. My template files are below.
loginform.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>

result.ftl

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

评论

The error message is right. In your Java code data is used as the data-model root. The root itself is not a top-level variable, but the container of the top-level variables. So for example ${Hello} would work, and print "Your not null!". (Also note that "data" is just a local variable name, which is gone during Java compilation, and you never pass the "data" variable name to FreeMarker.) So you should make a root Map (or bean), put the data Map (or bean) into it, and pass root to Template.process.

Update: That is, where now you have temp.process(data, writer);, you should have:

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

temp.process(root, writer);

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • FreeMarker template error: The following has evaluated to null or missing | BUT NOT TRUE
    The error I'm facing is so weird. Everything looks fine, but I get this error when the browser sends the GET request to the server. What I'm trying to do is actually catching the HTTP parameters, save them in an object saved in an ArrayList sending to a Freemarker template. Could you please help me? Thanks a lot. The error: freemarker.log._JULLoggerFactory$JULLogger error SEVERE: Error executing FreeMarker template FreeMarker template error: The following has evaluated to null or missing: ==> item.lat1 [in template "view/result.ftl" at line 18, column 15] freemarker.core
  • FreeMarker 模板错误:以下已评估为空或缺失 | 但不是真的(FreeMarker template error: The following has evaluated to null or missing | BUT NOT TRUE)
    问题 我面临的错误太奇怪了。 一切看起来都很好,但是当浏览器向服务器发送 GET 请求时出现此错误。 我想要做的实际上是捕获 HTTP 参数,将它们保存在保存在 ArrayList 中的对象中,然后发送到 Freemarker 模板。 请你帮助我好吗? 非常感谢。 错误: freemarker.log._JULLoggerFactory$JULLogger 错误 严重:执行 FreeMarker 模板时出错 FreeMarker 模板错误:以下内容已评估为 null 或缺失:==> item.lat1 [in template "view/result.ftl" at line 18, column 15] freemarker.core.InvalidReferenceException: [... 异常消息已打印; 见上面...] 在 freemarker.core.InvalidReferenceException.getInstance(InvalidReferenceException.java:131) 在 freemarker.core.EvalUtil.coerceModelToString(EvalUtil.java:355) 在 freemarker.core.Expression.evalAndCoerceToString(Expression.java
  • Liferay 7 Freemarker Template. staticUtil has evaluated to NULL or missing - Tried to get JournalArticle's Categories
    Hi fellow Liferay'ers, I'm trying to get the categories of a journalArticle with a Freemarker template. I tried this code: <#assign journalArticleId = .vars['reserved-article-id'].data> <#assign journalArticleResourceLocalServiceUtil = staticUtil["com.liferay.portlet.journal.service.JournalArticleResourceLocalServiceUtil"]> <#assign assetCategoryLocalServiceUtil = staticUtil["com.liferay.portlet.asset.service.AssetCategoryLocalServiceUtil"]> <#assign articleResourcePK = journalArticleResourceLocalServiceUtil.getArticleResourcePrimKey(groupId, journalArticleId)/> <#assign categoryList
  • Liferay 7 Freemarker 模板。 staticUtil 已评估为 NULL 或缺失 - 试图获取 JournalArticle 的类别(Liferay 7 Freemarker Template. staticUtil has evaluated to NULL or missing - Tried to get JournalArticle's Categories)
    问题 嗨,Liferay'ers, 我正在尝试使用 Freemarker 模板获取 journalArticle 的类别。 我试过这段代码: <#assign journalArticleId = .vars['reserved-article-id'].data> <#assign journalArticleResourceLocalServiceUtil = staticUtil["com.liferay.portlet.journal.service.JournalArticleResourceLocalServiceUtil"]> <#assign assetCategoryLocalServiceUtil = staticUtil["com.liferay.portlet.asset.service.AssetCategoryLocalServiceUtil"]> <#assign articleResourcePK = journalArticleResourceLocalServiceUtil.getArticleResourcePrimKey(groupId, journalArticleId)/> <#assign categoryList=assetCategoryLocalServiceUtil.getCategories("com.liferay
  • spring boot整合freemarker的踩坑记
    spring boot整合freemarker的踩坑记 报错问题原因解决方法 报错 2021-04-23 02:01:18.148 ERROR 9484 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is freemarker.core.InvalidReferenceException: The following has evaluated to null or missing: ==> hots [in template "inc/right.ftl" at line 6, column 11] ---- Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or
  • Android Studio “IDE error occured” on create new Activity
    (See update at the bottom) Since Android Studio updated itself to v3.0, I can't make a new Activity.. I get this error reporting dialog showing 2 errors. I tried with a different project, tried cleaning the project, resyncing gradle, restarting my computer, uninstalling/reinstalling Android Studio, tried following Google's project Gradle migration video but nothing changes and I can't work anymore... Any ideas? I didn't click "disable plugin" to disable Android Support as I don't want to break something I don't know about. Details of first error message: null java.lang.NullPointerException at
  • Freemarker 不分配 staticUtil(Freemarker does not assign staticUtil)
    问题 我在liferay 6.2上工作过应用程序显示模板,我使用freemarker帮助对liferay的动态数据列表进行分页。 当我升级到liferay 7时,这是一个问题。 Liferay 7 使​​用代码<#assign records = ddlDisplayTemplateHelper.getRecords(reserved_record_set_id)>来获取记录。 旧代码: <#assign DDLRecordLocalService = serviceLocator.findService("com.liferay.portlet.dynamicdatalists.service.DDLRecordLocalService")> <#assign records = DDLRecordLocalService.getRecords(reserved_record_set_id)> <#assign totalRecord = DDLRecordLocalService.getRecordsCount(reserved_record_set_id, 0) > 它不起作用。 所以我尝试<#assign serviceLocator = staticUtil["com.liferay.portal.template.ServiceLocator"]
  • Android Studio 在创建新活动时“发生 IDE 错误”(Android Studio “IDE error occured” on create new Activity)
    问题 (见底部更新) 由于 Android Studio 将自身更新到 v3.0,我无法创建新的 Activity.. 我收到此错误报告对话框,显示 2 个错误。 我尝试了一个不同的项目,尝试清理项目,重新同步 gradle,重新启动我的计算机,卸载/重新安装 Android Studio,尝试关注 Google 的项目 Gradle 迁移视频,但没有任何变化,我不能再工作了......有什么想法吗? 我没有点击“禁用插件”来禁用Android 支持,因为我不想破坏我不知道的东西。 第一条错误消息的详细信息: null java.lang.NullPointerException at com.android.tools.idea.templates.TemplateManager$2.actionPerformed(TemplateManager.java:481) at com.intellij.openapi.actionSystem.ex.ActionUtil$1.run(ActionUtil.java:215) at com.intellij.openapi.actionSystem.ex.ActionUtil.performActionDumbAware(ActionUtil.java:232) at com.intellij.openapi.actionSystem
  • Freemarker does not assign staticUtil
    I worked Application Display Templates on liferay 6.2, I use freemarker help pagination the dynamics data list of liferay. When I upgrade to liferay 7, it is a problem. Liferay 7 use code <#assign records = ddlDisplayTemplateHelper.getRecords(reserved_record_set_id)> for get a records. Old code: <#assign DDLRecordLocalService = serviceLocator.findService("com.liferay.portlet.dynamicdatalists.service.DDLRecordLocalService")> <#assign records = DDLRecordLocalService.getRecords(reserved_record_set_id)> <#assign totalRecord = DDLRecordLocalService.getRecordsCount(reserved_record_set_id, 0) > It
  • 在freemarker中是否可以在包含文件之前检查文件是否存在?(In freemarker is it possible to check to see if a file exists before including it?)
    问题 我们正在尝试在 freemarker 中构建一个系统,其中可以选择性地添加扩展文件来替换标准模板的块。 我们已经到了这一步 <#attempt> <#include "extension.ftl"> <#recover> Standard output </#attempt> 所以 - 如果 extension.ftl 文件存在,它将被使用,否则会输出恢复块内部的部分。 这样做的问题是 freemarker 总是记录导致恢复块触发的错误。 所以我们需要两件事之一: 如果文件不存在,则不要调用包含 - 因此需要检查文件是否存在。 -或者- 一种在不更改日志记录的情况下防止在恢复块内记录错误的方法,以防止出现所有 freemarker 错误。 回答1 更简单的解决方案是: <#attempt> <#import xyz.ftl> your_code_here <#recover> </#attempt> 回答2 我们已经编写了一个自定义宏来为我们解决这个问题。 在早期测试中,它运行良好。 要包含它,请添加如下内容(其中 mm 是 Spring ModelMap): mm.addAttribute(IncludeIfExistsMacro.MACRO_NAME, new IncludeIfExistsMacro()); import java.io.IOException
  • SpringBoot模板引擎
    springboot模板引擎 测试是否springboot集成是否成功 thymeleaf模板thymeleaf中${}语法thymeleaf中list遍历thymeleaf解决html转译问题 Freemarker模板Freemarker中获取单个值写法htmlFreemarker中条件语法htmlFreemarker中 exists用在逻辑判断htmlFreemarker中 list 循环htmlFreemarker中 局部变量(assign)/全局变量(global)htmlpomapplication.yml文件的默认配置解决报错:缺失实体类get.set问题解决报错ftl文件没有在application.xml对应得位置下完整效果 测试是否springboot集成是否成功 相当与集成mybatis ThymeleafController package com.wxm.springboot.controller.springboot2; import com.wxm.springboot.entity.springboot2.User; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import
  • Freemarker URL 模板加载器(Freemarker URL Template Loader)
    问题 我想从一个或多个 URL 加载 Freemarker 模板,因此我继承了 URLTemplate 加载器类并覆盖了 getURL(..) 方法以返回目标 URL(见下文)。 然后,我将这个类的几个实例添加到多模板加载器中,并将其添加到 Freemarker 配置中。 当第一个 URL 返回一个模板但没有调用其他模板加载器时,这可以正常工作。 我做错了什么? 我通过 Restlet 框架使用 Freemarker v2.3。 : : : : : : : : : : TemplateLoader[] loaders = new TemplateLoader[] { new MyTemplateLoader(new URL(request.getRootRef() + app.getRoot())), new MyTemplateLoader(new URL(request.getRootRef() + "/")) }; freemarkerConfig.setTemplateLoader(new MultiTemplateLoader(loaders)); : : : : : : : : : : public class MyTemplateLoader extends URLTemplateLoader { private URL root; public
  • spring security 3.2.0 csrf token not working in freemarker template
    After uprading to Spring Security 3.2.0 and configuring the xml, the _csrf token is not working. Fundamentals: Spring 4.0.1 Spring Security 3.2.0. Freemarker Template Language Step 1 - the spring security xml configuration: <!-- enable csrf protection via csrf-element --> <sec:http> <!-- --> <sec:csrf token-repository-ref="csrfTokenRepository" /> </sec:http> <!-- rewrite headerName --> <bean id="csrfTokenRepository" class="org.springframework.security.web.csrf.HttpSessionCsrfTokenRepository"> <property name="headerName" value="X-SECURITY" /> </bean> Step 2 - the freemarker template: <form
  • Springboot整合FreeMarker生成静态html两种方法
    1、 FTL指令 1.1、assign指令 1.2、include指令 1.3、 if指令 1.4、 list指令 2、 内建函数 2.1、获取集合大小 2.2、转换JSON字符串为对象 2.3、日期格式化 2.4、数字转换为字符串 3、空值处理运算符 3.1、判断某变量是否存在:“??” 3.2、缺失变量默认值:“!” 4、运算符 4.1、算数运算符 4.2、逻辑运算符 4.3、比较运算符 5、 springboot整合FreeMarker生成html 5.1、依赖 5.2、配置模板(方案一) 5.3、字符模板(方案二) 模板的常用标签 在FreeMarker模板中可以包括下面几个特定部分: ${…}:称为interpolations,FreeMarker会在输出时用实际值进行替代。 ${name}可以取得root中key为name的value。 ${person.name}可以取得成员变量为person的name属性 <#…>:FTL标记(FreeMarker模板语言标记):类似于HTML标记,为了与HTML标记区分 <@>:宏,自定义标签 注释:包含在<#–和-->(而不是)之间 1、 FTL指令 1.1、assign指令 此指令用于在页面上定义一个变量 (1)定义简单类型: <#assign linkman=“周先生”> 联系人:${linkman} (2)定义对象类型:
  • 如何检查FreeMarker模板中是否存在变量?(How to check if a variable exists in a FreeMarker template?)
    问题 我有一个Freemarker模板,其中包含一堆占位符,在处理模板时会为其提供值。 如果要提供userName变量,我想有条件地包括模板的一部分,例如: [#if_exists userName] Hi ${userName}, How are you? [/#if_exists] 但是,FreeMarker手册似乎表明if_exists已过时,但我找不到其他方法来实现这一目标。 当然,我可以简单地提供一个额外的布尔变量isUserName,并像这样使用它: [#if isUserName] Hi ${userName}, How are you? [/#if] 但是,如果有一种方法可以检查userName是否存在,那么我可以避免添加此额外变量。 回答1 要检查该值是否存在: [#if userName??] Hi ${userName}, How are you? [/#if] 或使用标准的freemarker语法: <#if userName??> Hi ${userName}, How are you? </#if> 要检查该值是否存在并且不为空: <#if userName?has_content> Hi ${userName}, How are you? </#if> 回答2 这似乎是一个更好的选择: <#if userName?has_content> ... do
  • spring security 3.2.0 csrf 令牌在 freemarker 模板中不起作用(spring security 3.2.0 csrf token not working in freemarker template)
    问题 升级到 Spring Security 3.2.0 并配置 xml 后,_csrf 令牌不起作用。 基础知识: 春天 4.0.1 春季安全 3.2.0。 Freemarker 模板语言 第一步——spring security xml配置: <!-- enable csrf protection via csrf-element --> <sec:http> <!-- --> <sec:csrf token-repository-ref="csrfTokenRepository" /> </sec:http> <!-- rewrite headerName --> <bean id="csrfTokenRepository" class="org.springframework.security.web.csrf.HttpSessionCsrfTokenRepository"> <property name="headerName" value="X-SECURITY" /> </bean> 第 2 步 - freemarker 模板: <form accept-charset="UTF-8" action="/portal" method="POST" name="formAddItemToCart"> <!-- ... --> <!-- inlcude csrf
  • 访问 <#list> 中对象的属性(Accessing properties of Objects within <#list>)
    问题 解决方案 我以前曾尝试向 LineItem 类添加访问器,例如 public String getItemNo() { return itemNo; } 并将 FTL 从${lineItem.itemNo}更改${lineItem.getItemNo()}但这不起作用。 解决方案是添加访问器但不更改 FTL(将其保留为${lineItem.itemNo} 。 背景 我正在使用 Freemarker 来格式化一些电子邮件。 在这封电子邮件中,我需要在发票上列出多行产品信息。 我的目标是传递一个对象列表(在 Map 中),以便我可以在 FTL 中迭代它们。 目前我遇到了无法从模板中访问对象属性的问题。 我可能只是错过了一些小东西,但此刻我很难过。 使用 Freemarker 的 Java 类 这是我的代码的更简化版本,以便更快地理解这一点。 LineItem是一个具有公共属性的公共类(与此处使用的名称匹配),使用一个简单的构造函数来设置每个值。 我也尝试过将私有变量与访问器一起使用,但这也不起作用。 我还将这个LineItem对象List存储在Map因为我还将 Map 用于其他键/值对。 Map<String, Object> data = new HashMap<String, Object>(); List<LineItem> lineItems = new
  • 如何通过FreeMarker模板在对象上调用Java方法?(How do I call java methods on an object from a FreeMarker template?)
    问题 是否可以调用从Freemarker模板获取参数的方法? 我有一个对象模型,试图用Freemarker渲染到网页中。 其中一个对象具有一种获取其内容的子列表的方法-采用用于过滤列表的参数: public List getunits(final String type); 我知道在JSP中您不能直接执行此操作,但是您可以编写自定义函数来实现所需的结果。 您如何在Freemarker中解决此问题? 编写自定义函数是否一样? 还是有某种实际调用这种功能的方法? 回答1 FreeMarker允许从表达式中调用通过模型可用的方法。 假设您的对象已公开为myBean ,则可以按以下方式调用该方法: <#list myBean.getunits("myType") as unit> do stuff with ${unit} </#list> 当然,您不必使用<list> ,因为您的方法返回了一个列表,所以仅作为示例。 回答2 正如ChssPly76所说,只要在模型中公开对象,就可以在Freemarker模板中执行方法调用。 但是请务必记住,如果您的方法返回NULL(无论出于何种原因),您将感到困惑 Expression myBean.getunits() is undefined on line .... 为了避免这种情况,您最好使用myBean.getunits(...)!
  • Struts 2 FreeMarker 模板错误 stack.findValue('top') 未定义(Struts 2 FreeMarker Template Error stack.findValue('top') is undefined)
    问题 我对 Struts2 有另一个问题。 我正在做一个图表和一个数据表。 发生的事情是在我的图表的第一次加载(并单击图表数据以链接到数据表)时,它工作正常。 但是当我更改图表中的参数并想要重新填充数据表时,它给了我这个错误: Error on line 69, column 13 in template/simple/select.ftl stack.findValue('top') is undefined. 不能分配给 itemKey 有问题的指令: ==> assignment: itemKey=stack.findValue('top') [on line 69, column 13 in template/simple/select.ftl] in user-directive s.iterator [on line 59, column 1 in template/simple/select.ftl] 堆栈跟踪 freemarker.core.InvalidReferenceException: Error on line 69, column 13 in template/simple/select.ftl stack.findValue('top') is undefined. It cannot be assigned to itemKey at
  • FreeMarker模板中处理错误的不同方法有哪些?(What are different ways to handle error in FreeMarker template?)
    问题 如何抑制FreeMarker模板错误? 我在这里寻找:http://freemarker.sourceforge.net/docs/pgui_config_errorhandling.html但我不知道如何“ TemplateExceptionHandler.IGNORE_HANDLER”。 我正在使用Struts2,还如何显示另一个ftl页面而不是显示堆栈跟踪? class MyTemplateExceptionHandler implements TemplateExceptionHandler { public void handleTemplateException(TemplateException te, Environment env, java.io.Writer out) throws TemplateException { try { out.write("[ERROR: " + te.getMessage() + "]"); } catch (IOException e) { throw new TemplateException("Failed to print error message. Cause: " + e, env); } } } ... cfg.setTemplateExceptionHandler(new