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(“,”)
;注意
。你是对的……我检查了早期版本,发现错误已经存在。这个错误在我今天发现之前几个月都没有被注意到。我认为这个错误是最近产生的,因为没有人来向我抱怨。谢谢你的回答。