当前位置: 首页 > 知识库问答 >
问题:

Freemarker无法从列表中获取对象值

高森
2023-03-14

我使用最新的freemarker版本2.3.23我有列表,其中包含用户对象,用户对象很简单,只包含名称属性。我的ftl文件如下所示:

<#list userlist>
<#items as item>
    ${item.name}
</#items>

我的Java代码如下所示:

public static void main(String[] args) throws Exception {
    List<User> user = new ArrayList<User>();
    User user1 = new User();
    User user2 = new User();
    user1.setName("jason");
    user2.setName("tony");
    user.add(user1);
    user.add(user2);
    Map<String, Object> params = new HashMap<String, Object>();
    params.put("userlist", user);
    Template template = FreemarkerUtil.getTemplate(FreemarkerUtil.TEMPLATE_PATH, "test.ftl");
    FileWriter fw = null;
    try {
        fw = new FileWriter(new File(FreemarkerUtil.getProjOutputDomainPath() + "test.txt"));
        template.process(params, fw);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (fw != null) {
            fw.close();
        }
    }
} 
class User {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

错误显示如下:

The following has evaluated to null or missing:
    ==> item.name  [in template "test.ftl" at line 3, column 19]`enter code here`
    Tip: It's the step after the last dot 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: ${item.name}  [in template "test.ftl" at line 3, column 17]

    Java stack trace (for programmers):
    freemarker.core.InvalidReferenceException: [... Exception message was already printed; see it above ...]
    at freemarker.core.InvalidReferenceException.getInstance(InvalidReferenceException.java:131)
    at freemarker.core.EvalUtil.coerceModelToString(EvalUtil.java:355)
    at freemarker.core.Expression.evalAndCoerceToString(Expression.java:82)
    at freemarker.core.DollarVariable.accept(DollarVariable.java:41)
    at freemarker.core.Environment.visit(Environment.java:324)
    at freemarker.core.MixedContent.accept(MixedContent.java:54)
    at freemarker.core.Environment.visitByHiddingParent(Environment.java:345)
    at freemarker.core.IteratorBlock$IterationContext.executeNestedBlockInner(IteratorBlock.java:268)
    at freemarker.core.IteratorBlock$IterationContext.executeNestedBlock(IteratorBlock.java:220)
    at freemarker.core.IteratorBlock$IterationContext.loopForItemsElement(IteratorBlock.java:207)
    at freemarker.core.Items.accept(Items.java:43)
    at freemarker.core.Environment.visitByHiddingParent(Environment.java:345)
    at freemarker.core.IteratorBlock$IterationContext.executeNestedBlockInner(IteratorBlock.java:276)
    at freemarker.core.IteratorBlock$IterationContext.executeNestedBlock(IteratorBlock.java:220)
    at freemarker.core.IteratorBlock$IterationContext.accept(IteratorBlock.java:194)
    at freemarker.core.Environment.visitIteratorBlock(Environment.java:572)
    at freemarker.core.IteratorBlock.acceptWithResult(IteratorBlock.java:78)
    at freemarker.core.IteratorBlock.accept(IteratorBlock.java:64)
    at freemarker.core.Environment.visit(Environment.java:324)
    at freemarker.core.Environment.process(Environment.java:302)
    at freemarker.template.Template.process(Template.java:325)
    at auto.freemarker.template.MySQLGenerator.main(MySQLGenerator.java:61)

共有1个答案

公冶峰
2023-03-14

只公开公共类的方法/属性,因此User类必须是公共的(或者getname()必须从公共类/接口继承)。

 类似资料:
  • 我有一个对象列表,我想从它的字段中得到一个列表<假设我通过了列表

  • 问题内容: 当存在时,是否有可能获得全部列表?是否为此准备了电话,还是我必须编写一个foreach循环,如: 问题答案: Java 8及更高版本: 如果需要确保得到结果,则必须将最后一行更改为: Java 7及以下版本: Java 8之前的标准集合API不支持这种转换。您必须编写一个循环(或将其包装在您自己的“地图”函数中),除非您使用一些更高级的集合API /扩展。 (您的Java代码段中的行正

  • 我最近开始使用rest assured测试一些XML。下面是一个例子: 我想在这里实现的是,检查每次购物是否有一个容器号="8",然后检查每个容器是否有颜色="绿色"。这是代码: 这工作得非常好,当我调试这一点时,我得到了我想要实现的东西: 这是一个三元素列表,其中每个元素都等于“绿色”。 但当我试图检查每一次购物是否都有一个类别type=“present”,然后检查这些类别是否都有label=“

  • 我有一个包含两个成员的类和该类的对象列表。现在我想从对象列表中提取成员列表。 例如: 现在我需要从学生列表中检索studentName列表。如何使用java8流实现这一点? 不使用流的解决方案:

  • 问题内容: 我有一个JavaScript对象,例如 如何获取此对象中键的长度和列表? 问题答案: var obj = {

  • 我试图实现一个使用Spring Boot的客户机,它将从一个站点获取所有产品并将它们存储在数据库中。储存部分已经处理好了,但我很难找到所有产品的清单。当用Postman测试时,我可以用这样的身体得到响应: