freemarker的classic_compatible设置,解决报空错误(转)

原文地址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>

问题圆满解决了。

 

关于freemarker的classic_compatible属性的使用场景和解决

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Freemarker的`index_of`是一个内建函数,用于获取一个子串在指定字符串中的第一次出现的索引位置。它的语法是`${string?index_of(substr)}`,其中`string`是一个字符串,`substr`是要搜索的子串。 如果`substr`存在于`string`中,函数将返回第一次出现的位置索引(从0开始计数)。如果不存在,函数将返回-1。 下面是一个示例: 假设我们有一个字符串`${str}`的值是`"Hello World"`,我们想要获取子串`"World"`在字符串中的索引位置。我们可以使用`${str?index_of("World")}`来实现。如果`"World"`在`"Hello World"`中存在,函数将返回`6`(即`"W"`的位置索引),否则将返回`-1`。 需要注意的是,`index_of`函数是区分大小写的。这意味着如果子串的大小写与字符串中的不匹配,函数将无法找到该子串。 另外,如果我们想获取子串在字符串中的最后一次出现的位置索引,可以使用`last_index_of`函数,语法和用法与`index_of`类似。 总而言之,Freemarker的`index_of`函数是一个实用的内建函数,可以帮助我们在字符串中查找子串的位置索引。 ### 回答2: FreeMarker中的index_of函数用于查找指定子串在字符串中第一次出现的位置。该函数的语法如下: ``` ftl <#assign position = mainString?index_of(subString)> ``` 其中,mainString是要进行查找的主字符串,subString是要查找的子串。index_of函数将返回子串在主字符串中的索引位置,如果找不到该子串,则返回-1。 以下是一个简单的示例,演示如何使用index_of函数: ``` ftl <#assign str = "Hello, World!"> <#assign position = str?index_of("World")> <p>子串 "World" 在字符串 "${str}" 中的索引位置是 ${position}</p> ``` 上述代码将输出: ``` 子串 "World" 在字符串 "Hello, World!" 中的索引位置是 7 ``` 在本例中,我们查找子串"World"在主字符串"Hello, World!"中的位置,并将结果赋值给变量position。然后,我们将结果显示在页面上,以便查看。 需要注意的是,index_of函数是区分大小写的,如果要进行不区分大小写的查找,可以使用index_of(word, substr, startIndex, ignoreCase)函数,其中ignoreCase参数设置为true。 总结:FreeMarker中的index_of函数用于查找子串在字符串中的位置,并可以根据需要进行大小写敏感的查找。 ### 回答3: Freemarker中的index_of函数用于在一个字符串中查找指定子字符串第一次出现的位置,返回该位置的索引值。具体用法如下: 1.语法:`<#assign result = string_var?index_of(substring)>` 2.其中,`string_var`是要搜索的字符串变量,`substring`是要查找的子字符串。 3.如果找到了子字符串,`result`会是子字符串在原字符串中第一次出现的位置的索引值(从0开始)。如果没有找到,`result`会是-1。 示例: ``` <#assign str = "Hello, world!"> <#assign result = str?index_of("world")> <p>子字符串的位置:${result}</p> ``` 输出: 子字符串的位置:7 在上述示例中,我们先定义了一个字符串变量“str”,然后使用`index_of`函数查找子字符串"world"在字符串中的位置,并将结果赋值给变量"result"。最后通过`${result}`输出结果。 注意: - `index_of`函数区分大小写,即大写字母和小写字母是不同的字符。 - 如果要忽略大小写进行查找,可以使用`?lower_case`函数换字符串为全部小写,然后再进行查找。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值