FreeMarker template error: The following has evaluated to null or missing | BUT NOT TRUE
FreeMarker template error: The following has evaluated to null or missing | BUT NOT TRUE
我遇到的错误太奇怪了。一切看起来都很好,但是当浏览器向服务器发送 GET 请求时出现此错误。我想要做的实际上是捕获 HTTP 参数,将它们保存在一个对象中,该对象保存在一个 ArrayList 中,发送到一个 Freemarker 模板。
你能帮帮我吗?非常感谢。
错误:
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.InvalidReferenceException: [...异常消息是
已经打印;见上面...]在
freemarker.core.InvalidReferenceException.getInstance(InvalidReferenceException.java:131)
在 freemarker.core.EvalUtil.coerceModelToString(EvalUtil.java:355)
在
freemarker.core.Expression.evalAndCoerceToString(Expression.java:82)
在 freemarker.core.DollarVariable.accept(DollarVariable.java:41) 在
freemarker.core.Environment.visit(Environment.java:324) 在
freemarker.core.MixedContent.accept(MixedContent.java:54) 在
freemarker.core.Environment.visit通过隐藏父级(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.visit迭代器块(Environment.java:572)
在
freemarker.core.IteratorBlock.acceptWithResult(IteratorBlock.java:78)
在 freemarker.core.IteratorBlock.accept(IteratorBlock.java:64) 在
freemarker.core.Environment.visit(Environment.java:324) 在
freemarker.core.MixedContent.accept(MixedContent.java:54) 在
freemarker.core.Environment.visit(Environment.java:324) 在
freemarker.core.Environment.process(Environment.java:302) 在
freemarker.template.Template.process(Template.java:325) 在
spark.template.freemarker.FreeMarkerEngine.render(FreeMarkerEngine.java:71)
在 controller.App.lambda$main$1(App.java:57) 在
spark.RouteImpl$1.handle(RouteImpl.java:58) 在
spark.webserver.MatcherFilter.doFilter(MatcherFilter.java:162) 在
spark.webserver.JettyHandler.doHandle(JettyHandler.java:61) 在
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) 在
org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:302) 在
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:以下评价了
为空或丢失:
==> 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;
}
和result.ftl:
<#list list as item>
<h2>${item.lat1}</h2>
<h2>${item.lon1}</h2>
<h2>${item.lat2}</h2>
<h2>${item.lon2}</h2>
</#list>
您正在向 "list" 添加 1 个 Bereken class 实例。
所以我假设 Bereken class 不提供 public 属性 lat1、lat2、lon1、lon2 或相应的 getter 方法。
我昨天刚 运行 看过这个。我正在学习一个教程,其中一个步骤没有在创建对象的 class 中包含 getter 方法的代码。我想作者只是假设 reader 知道应该已经发生了。
因此,无论这个 'Bereken' 东西在哪里(我刚刚了解到它是一个 JavaBean class),请务必为 setter 和 getter 添加方法与 'list'.
中每个元素关联的属性
我知道这是一个老问题,但我刚遇到这个问题。如果您将私有 class 的实例传递给它(我刚刚尝试过),Freemarker 也会抱怨值 "is null or missing" 。如果你传入一个 Java Bean class,它 需要 为 public
。在这种情况下,错误消息非常具有误导性。
我遇到的错误太奇怪了。一切看起来都很好,但是当浏览器向服务器发送 GET 请求时出现此错误。我想要做的实际上是捕获 HTTP 参数,将它们保存在一个对象中,该对象保存在一个 ArrayList 中,发送到一个 Freemarker 模板。
你能帮帮我吗?非常感谢。
错误:
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.InvalidReferenceException: [...异常消息是 已经打印;见上面...]在 freemarker.core.InvalidReferenceException.getInstance(InvalidReferenceException.java:131) 在 freemarker.core.EvalUtil.coerceModelToString(EvalUtil.java:355) 在 freemarker.core.Expression.evalAndCoerceToString(Expression.java:82) 在 freemarker.core.DollarVariable.accept(DollarVariable.java:41) 在 freemarker.core.Environment.visit(Environment.java:324) 在 freemarker.core.MixedContent.accept(MixedContent.java:54) 在 freemarker.core.Environment.visit通过隐藏父级(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.visit迭代器块(Environment.java:572) 在 freemarker.core.IteratorBlock.acceptWithResult(IteratorBlock.java:78) 在 freemarker.core.IteratorBlock.accept(IteratorBlock.java:64) 在 freemarker.core.Environment.visit(Environment.java:324) 在 freemarker.core.MixedContent.accept(MixedContent.java:54) 在 freemarker.core.Environment.visit(Environment.java:324) 在 freemarker.core.Environment.process(Environment.java:302) 在 freemarker.template.Template.process(Template.java:325) 在 spark.template.freemarker.FreeMarkerEngine.render(FreeMarkerEngine.java:71) 在 controller.App.lambda$main$1(App.java:57) 在 spark.RouteImpl$1.handle(RouteImpl.java:58) 在 spark.webserver.MatcherFilter.doFilter(MatcherFilter.java:162) 在 spark.webserver.JettyHandler.doHandle(JettyHandler.java:61) 在 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) 在 org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:302) 在 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:以下评价了 为空或丢失: ==> 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;
}
和result.ftl:
<#list list as item>
<h2>${item.lat1}</h2>
<h2>${item.lon1}</h2>
<h2>${item.lat2}</h2>
<h2>${item.lon2}</h2>
</#list>
您正在向 "list" 添加 1 个 Bereken class 实例。 所以我假设 Bereken class 不提供 public 属性 lat1、lat2、lon1、lon2 或相应的 getter 方法。
我昨天刚 运行 看过这个。我正在学习一个教程,其中一个步骤没有在创建对象的 class 中包含 getter 方法的代码。我想作者只是假设 reader 知道应该已经发生了。
因此,无论这个 'Bereken' 东西在哪里(我刚刚了解到它是一个 JavaBean class),请务必为 setter 和 getter 添加方法与 'list'.
中每个元素关联的属性我知道这是一个老问题,但我刚遇到这个问题。如果您将私有 class 的实例传递给它(我刚刚尝试过),Freemarker 也会抱怨值 "is null or missing" 。如果你传入一个 Java Bean class,它 需要 为 public
。在这种情况下,错误消息非常具有误导性。