原文地址https://www.cnblogs.com/Weagle/p/5417947.html
在项目二开中,使用的是freemarker模板,很多地方报空指针异常,刚开始改了几个页面,后来发现,这种问题很多,发现了这个解决方法
错误样例如下:
ERROR: freemarker.runtime - Error executing FreeMarker template
FreeMarker template error:
The following has evaluated to null or missing:
==> user [in template "include/header.ftl" at line 4, column 14]
----
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<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----
----
FTL stack trace ("~" means nesting-related):
- Failed at: #if user [in template "include/header.ftl" at line 4, column 9]
- Reached through: #include "/include/header.ftl" [in template "index.ftl" at line 6, column 1]
----
Java stack trace (for programmers):
----
freemarker.core.InvalidReferenceException: [... Exception message was already printed; see it above ...]
at freemarker.core.InvalidReferenceException.getInstance(InvalidReferenceException.java:131)
at freemarker.core.UnexpectedTypeException.newDesciptionBuilder(UnexpectedTypeException.java:77)
可以看到,在读取user的时候,因为为空,报错了,错误处的代码是这样的
<#if user>
其实准确的写法应该是
<#if user??>
如果要消除错误,需要把前端代码修后成后面这种形式,这让一个后端开发的人来说很不合理啊,而且,模板中不止一处出现了这种写法。
请教以后把freemarker的配置修改如下:
<bean id="freemarkerConfig"
class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPath" value="/template/" />
<property name="freemarkerSettings">
<!-- 设置默认的编码方式,原先是GBK,需要设置成utf-8 -->
<props>
<!--用于解决前端报空指针问题-->
<prop key="classic_compatible">true</prop>
<prop key="defaultEncoding">utf-8</prop>
<prop key="template_exception_handler">rethrow</prop>
</props>
</property>
</bean>
添加了一行
<prop key="classic_compatible">true</prop>
问题圆满解决了。