FreeMarker模板错误:以下内容已评估为null或缺失但不是真的

时间:2016-03-04 21:03:45

标签: java maven freemarker

我面临的错误是如此奇怪。一切看起来都很好,但是当浏览器将GET请求发送到服务器时,我收到此错误。我想要做的是实际捕获HTTP参数,将它们保存在发送到Freemarker模板的ArrayList中保存的对象中。

你能帮帮我吗?非常感谢。

错误:

  
    

freemarker.log._JULLoggerFactory $ JULLogger错误严重:错误     执行FreeMarker模板FreeMarker模板错误:以下内容     已评估为null或缺失:     ==> item.lat1 [在模板“view / result.ftl”第18行第15栏]

  
     

freemarker.core.InvalidReferenceException:[...异常消息是   已打印;见上面......]   freemarker.core.InvalidReferenceException.getInstance(InvalidReferenceException.java:131)     at freemarker.core.EvalUtil.coerceModelToString(EvalUtil.java:355)     在   freemarker.core.Expression.evalAndCoerceToString(Expression.java:82)     在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)     在   freemarker.core.IteratorBlock $ IterationContext.executeNestedBlockInner(IteratorBlock.java:268)     在   freemarker.core.IteratorBlock $ IterationContext.executeNestedBlock(IteratorBlock.java:220)     在   freemarker.core.IteratorBlock $ IterationContext.accept(IteratorBlock.java:194)     在   freemarker.core.Environment.visitIteratorBlock(Environment.java:572)     在   freemarker.core.IteratorBlock.acceptWithResult(IteratorBlock.java:78)     在freemarker.core.IteratorBlock.accept(IteratorBlock.java:64)at   freemarker.core.Environment.visit(Environment.java:324)at   freemarker.core.MixedContent.accept(MixedContent.java:54)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   spark.template.freemarker.FreeMarkerEngine.render(FreeMarkerEngine.java:71)     在controller.App.lambda $ main $ 1(App.java:57)at   spark.RouteImpl $ 1.handle(RouteImpl.java:58)at   spark.webserver.MatcherFilter.doFilter(MatcherFilter.java:162)at at   spark.webserver.JettyHandler.doHandle(JettyHandler.java:61)at at   org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:189)     在   org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)     在   org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:119)     在org.eclipse.jetty.server.Server.handle(Server.java:517)at   org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:302)at at   org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:242)     在   org.eclipse.jetty.io.AbstractConnection $ ReadCallback.succeeded(AbstractConnection.java:245)     在org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:95)     在   org.eclipse.jetty.io.SelectChannelEndPoint $ 2.run(SelectChannelEndPoint.java:75)     在   org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceAndRun(ExecuteProduceConsume.java:213)     在   org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:147)     在   org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:654)     在   org.eclipse.jetty.util.thread.QueuedThreadPool $ 3.run(QueuedThreadPool.java:572)     在java.lang.Thread.run(Thread.java:745)

     

[qtp285763673-17]错误spark.webserver.MatcherFilter -   java.lang.IllegalArgumentException异常:   freemarker.core.InvalidReferenceException:以下内容已经过评估   为null或缺失:   ==> item.lat1 [在模板“view / result.ftl”第18行第15栏]

..但是确实如此,因为我打印了数组,它运行正常!

  final FreeMarkerEngine freeMarkerEngine = new FreeMarkerEngine();
    final Configuration freeMarkerConfiguration = new Configuration();
    freeMarkerConfiguration.setTemplateLoader(new ClassTemplateLoader(App.class, "/"));
    freeMarkerEngine.setConfiguration(freeMarkerConfiguration);

    get("/rest", (request, response) -> {
        Double lat1 = Double.parseDouble(request.queryParams("lat1") != null ? request.queryParams("lat1") : "anonymous");
        Double lon1 = Double.parseDouble(request.queryParams("lon1") != null ? request.queryParams("lon1") : "anonymous");
        Double lat2 = Double.parseDouble(request.queryParams("lat2") != null ? request.queryParams("lat2") : "anonymous");
        Double lon2 = Double.parseDouble(request.queryParams("lon2") != null ? request.queryParams("lon2") : "anonymous");

        if (shouldReturnHtml(request)) {
            response.status(200);
            response.type("text/html");
            Map<String, Object> attributes = new HashMap<>();
            attributes.put("list",loadTheList(lat1,lon1,lat2,lon2));
            return freeMarkerEngine.render(new ModelAndView(attributes, "/view/result.ftl"));
        }
        else {
            response.status(200);
            response.type("application/json");
            return null;
        }
    });


}

private static boolean shouldReturnHtml(Request request) {
    String accept = request.headers("Accept");
    return accept != null && accept.contains("text/html");
}
public static ArrayList<Bereken> loadTheList(double lat1, double lon1, double lat2, double lon2) {
    ArrayList<Bereken> list = new ArrayList<>();
    list.add(new Bereken(lat1,lon1,lat2,lon2));
    return list;
}

结果.ftl:

      <#list list as item>
        <h2>${item.lat1}</h2>
        <h2>${item.lon1}</h2>
        <h2>${item.lat2}</h2>
        <h2>${item.lon2}</h2>
    </#list>

3 个答案:

答案 0 :(得分:1)

您正在将“Bereken”类的1个实例添加到“列表”中。 所以我认为Bereken类不提供公共属性lat1,lat2,lon1,lon2或相应的getter方法。

答案 1 :(得分:0)

我昨天刚碰过这个。我正在编写一个教程,其中一个步骤没有在创建对象的类中包含getter方法的代码。我想作者只是假设读者已经知道应该已经发生过了。

因此,无论这个'Bereken'是什么(我刚学会它是一个JavaBean类),一定要为'list'中与每个元素相关联的属性添加setter和getter方法。

答案 2 :(得分:0)

我知道这是一个老问题,但是我碰到了这个问题。如果您将值传递给私有类的实例(我刚刚尝试过),Freemarker也将抱怨该值“为null或丢失”。如果您传入Java Bean类,则需要public。在这种情况下,错误消息非常容易引起误解。