说明:记录一次使用FreeMarker的错误;
场景
有个小需求,需要在生成的PDF文件中增加一个金额数据,是一个很小的改动,SQL增加一个返回值,VO对象增加一个属性,FreeMarker模板增加一个变量就可以了。但是修改后,生成PDF文件的接口报错了。
这种问题,最难受的是,IDEA中的静态文件与测试环境的存放位置不同。如果是路径问题,没有获取到模板文件,就很难排查。
排查
首先,使用Arthas对接口、方法进行trace
,发现是在创建PDF抛了一个空指针异常。
我怀疑是其中有个参数为null,于是对该变量右边的赋值方法进行了watch
。果然,返回值为null
开始,我以为是template.html文件没有获取到,于是仔仔细细地对比了代码中这个路径与测试环境文件存放的路径,一模一样,不会有错。于是我又对该方法进行了trace
,看是不是代码报错,导致返回了null。
果不其然,不是路径的问题,而是模板有问题,于是我将测试环境的模板拷贝到本地,测试。就在上面这行方法打断点,计算结果,其中的一条信息如下:
解决
对比模板中的其他数据,用到 ?String()
函数的地方,类型都是Bigdecimal的,于是我将VO对象中的这个属性类型改为Bigdecimal就OK了。
参考
FreeMarker语法参考:FreeMarker使用