Java 更改SpringBoot依赖项后在空字段上加入时出现Freemarker错误
已解决:错误已经存在,我只是假设我最近创建了它。。。Java 更改SpringBoot依赖项后在空字段上加入时出现Freemarker错误,java,spring-boot,freemarker,Java,Spring Boot,Freemarker,已解决:错误已经存在,我只是假设我最近创建了它。。。 我有一个使用SpringMVC和Freemarker的项目。 在我的控制器中,我向名为activities的模型添加了一个属性,如下所示: @GetMapping("/activities/{floorId}") public String activities(Model model, @PathVariable String floorId) { model.addAttribute("activities", activity
我有一个使用SpringMVC和Freemarker的项目。
在我的控制器中,我向名为
activities
的模型添加了一个属性,如下所示:
@GetMapping("/activities/{floorId}")
public String activities(Model model, @PathVariable String floorId) {
model.addAttribute("activities", activityService.getActivitiesForFloor(floorId));
return "floor/activities";
}
<#list activities as activity>
<tr>
<td>${activity.id}</td>
<td>${activity.involvedTiles?join(", ")}</td>
</tr>
</#list>
activities
有一个名为involvedTiles
的字段,该字段有时为null
。这很好。在Freemarker视图中,我使用的modelattribute如下所示:
@GetMapping("/activities/{floorId}")
public String activities(Model model, @PathVariable String floorId) {
model.addAttribute("activities", activityService.getActivitiesForFloor(floorId));
return "floor/activities";
}
<#list activities as activity>
<tr>
<td>${activity.id}</td>
<td>${activity.involvedTiles?join(", ")}</td>
</tr>
</#list>
${activity.id}
${activity.InvolvedFile?加入(“,”}
这一直有效(它从未给出错误)。但现在我突然发现了这个错误:
2016-10-21 13:56:17,163 ERROR [http-nio-8080-exec-10] o.a.c.c.C.[.[.[.[dispatcherServlet] [DirectJDKLog.java:181] 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:
==> activity.involvedTiles [in template "floor/activities.ftl" at line 51, column 27]
----
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#deleted-channelwhen-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----
...etc...
2016-10-21 13:56:17163错误[http-nio-8080-exec-10]o.a.c.c.c.[dispatcherServlet][DirectJDKLog.java:181]路径为[]的上下文中Servlet[dispatcherServlet]的Servlet.service()引发异常[Request processing failed;嵌套异常为freemarker.core.InvalidReferenceException:以下值为null或缺失:
==>activity.involvedTiles[在第51行第27列的模板“floor/activities.ftl”中]
----
提示:导致此错误的是最后一个点之后的步骤,而不是之前的步骤。
----
提示:如果已知失败的表达式在法律上引用了有时为null或缺少的内容,请指定一个默认值,如myOptionalVar!myDefault,或在出现时使用#在缺少时使用deleted channel。(这些仅涵盖表达式的最后一步;要覆盖整个表达式,请使用括号:(myOptionalVar.foo)!myDefault,(myOptionalVar.foo)??
----
等
我知道我遇到了这个错误,因为
activity.involvedTiles
是null
,我尝试将它与?join()一起使用
函数。但我不明白为什么会突然停止工作。我能想到的唯一一件事是,我已经将我的SpringBoot依赖项从1.3.0.RELEASE更新为1.4.1.RELEASE。在SpringBoot 1.3.0中他们使用,在SpringBoot 1.4.1中他们使用。我的问题是:Freemarker是否改变了一些东西,这就是我出现这个错误的原因吗?
我检查了和,但找不到解释此错误的内容。首先,您可以在控制器级别循环此活动集合,然后再将其放入模型映射中。在循环中,您可以检查活动的值和activity.InvolvedFile的值。如果控制器端的值正在打印,您可以确认错误在哪里。如果值为null,则不需要查找关于freemarker的信息 如何处理freemarker中的空值
在freemarker中,您可以像这样处理空值
<td><#if activity.involvedTiles??>${activity.involvedTiles?join(", ")}</#if></td>
${activity.involvedTiles?加入(“,”)
完整ftl文件
<#list activities as activity>
<tr>
<td>${activity.id}</td>
<td><#if activity.involvedTiles??>${activity.involvedTiles?join(", ")}</#if></td>
</tr>
</#list>
${activity.id}
${activity.InvolvedFile?加入(“,”}
?join
从未打算容忍null
,据我所知,也没有这样的错误(意外地允许null
)。此外,我还尝试了FreeMarker 2.3.21(一个非常旧的版本)它仍然不允许null
。活动。涉及的文件可以是null
,请参阅我编辑的问题。对于上面的Freemarker代码,这从来都不是问题。直到最近我才遇到这个错误,这就是我问这个问题的原因。如果您需要处理null
,您只需要在这种情况下,t为空字符串,那么上面带有#if
的示例是一个过度使用。它可以简单地写为:活动。涉及文件!?join(“,”)
;注意!
。你是对的……我检查了早期版本,发现错误已经存在。这个错误在我今天发现之前几个月都没有被注意到。我认为这个错误是最近产生的,因为没有人来向我抱怨。谢谢你的回答。