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

使用Freemarker显示任意Java对象及其字段的表

贺雪松
2023-03-14

首先,我读过这个问题,但它并没有解决我的问题。

        /**
     * Get objects in cache and add to ArrayList.
     */

    for(Iterator iter = currentCache.entrySet().iterator();iter.hasNext();){
        Map.Entry entry = (Map.Entry)iter.next();
        String key = (String) entry.getKey();
        Pof tempPof = (Pof)entry.getValue();
        tableList.add(tempPof);
        System.out.println("one loop");
    }

    request.setAttribute("beans",tableList);

    System.out.println("Size of tableList is: " + tableList.size());
    /**
     * Build an array containing the variable names of cached objects.
     */

    Field[] fields = Pof.class.getDeclaredFields();
    String[] variableNames = new String[fields.length];

    for(int j = 0; j < fields.length;j++){
        variableNames[j] = fields[j].getName();
        System.out.println(variableNames[j]);
    }

    request.setAttribute("colNames",variableNames);


    /**
     * numCols determines the number of columns displayed in the table.
     */

    int numCols = fields.length;
    String[] fieldStrings = new String[numCols];
    request.setAttribute("numCols",numCols);
    Pof thing = (Pof) tableList.get(0);
<table border = "1px">
        <thead>
            <tr>
                <th colspan="${numCols}">${selectedCache}</th>
            </tr>
            <tr>
                <#list colNames as colName>
                    <td>${colName}</td>
                </#list>
            </tr>
        </thead>
        <tbody>
            <#list beans as bean>
                <tr>
                    <#list colNames as colName>
                        <td>${bean[colName]}</td>
                    </#list>
                </tr>
            </#list>
        </tbody>

    </table>

这会给我带来以下错误:

InvalidReferenceException:以下内容的计算结果为null或缺失:==>bean[colName][在模板“front.ftl”第46行,第35列中]

提示:导致这个错误的是最后[]步骤,而不是之前的步骤。

提示:如果已知失败表达式在法律上引用的内容有时为null或缺少,则可以指定默认值,如myoptionalvar!mydefault,或者使用<#If myoptionalvar??>when-present<#else>when-missing。(这些仅覆盖表达式的最后一步;要覆盖整个表达式,请使用括号:(myoptionalvar.foo)!mydefault,(myoptionalvar.foo)??FTL堆栈跟踪(“~”表示与嵌套相关):-Failed at:${bean[colName]}[在模板“front.FTL”第46行,第33列]

at freemarker.core.InvalidReferenceException.getInstance(InvalidReferenceException.java:134)
at freemarker.core.EvalUtil.coerceModelToTextualCommon(EvalUtil.java:451)
at freemarker.core.EvalUtil.coerceModelToStringOrMarkup(EvalUtil.java:374)
at freemarker.core.DollarVariable.calculateInterpolatedStringOrMarkup(DollarVariable.java:96)
at freemarker.core.DollarVariable.accept(DollarVariable.java:59)
Truncated. see log file for complete stacktrace

问题似乎是我的ftl语法;也就是说,它不喜欢表达式${bean[colName]}。

问题:

共有1个答案

厉文栋
2023-03-14

它应该起作用,前提是:

  • POF是公共类
  • 每个colname“foo”
  • 都有一个公共的 pof.getfoo()方法
  • getfoo()返回非null值。如果它有时返回null,则必须指定要显示的内容,例如:${bean[colName]!'-'}
 类似资料:
  • 我正在努力解决一个奇怪的问题。 控制台是 如您所见,第一行输出了GeneratorField对象的名称,但是为什么第二个命令失败了? 我正在使用Freemarker 2.3.20 谢啦

  • 是否可以根据REST调用配置Item类来显示和隐藏特定字段?例如,当调用时,我希望从类中隐藏(并显示),而当调用时,我希望从类中隐藏。

  • 您也可以使用其他的构建脚本配置任意的对象. 例子: 14.5.使用别的脚本配置配置对象 build.gradle task config << { def pos = new java.text.FieldPosition(10) // 使用另一个脚本 apply from: 'other.gradle', to: pos println pos.beginIndex

  • 第一次在JAVA项目上使用FreeMarker,在配置汉字时使用堆栈。 看到了一些对FreeMarker.Properties进行更改的示例请求,但我没有这个文件。我只是导入。jar文件并使用它。 请告诉我该怎么做才能让它显示汉字。

  • 问题内容: 动机: 为了帮助进行远程调试(Java),能够请求远程服务器将任意对象发送到我的本地计算机进行检查是很有用的。但是,这意味着远程服务器必须能够序列化运行时事先未知的任意Java对象。 于是我四处询问,偶然发现了Kryo序列化库。根据Kryo的文档,主要功能是在序列化任意Java对象方面非常强大。对象不必实现,不需要no- arg构造函数就可以反序列化,而且我甚至不需要在序列化之前就了解

  • 我的背景是C,在那里我们可以使用子类对象访问父类的公共字段。示例: 如何在Java继承中实现同样的功能? 我还有另一个关于覆盖的问题,但由于Stackoverflow规则,我将作为单独的问题提问。 那么,使用子类对象引用打印/访问Java的父类方法的语法应该是什么?我尝试了。等,但不工作。