一次有意思的空指针,缺少字体

问题描述

公司“产品经理”临时提出来的需求,管理后台的某些的地方需要增加报表这样的东西,也就是传说中的导出excel。

本地测试都是正常的,但是部署到开发环境后是这个样子的:

Excel报错

多次debug调试,本地启动项目都是好的,部署到线上的环境就出问题了。突然就想起来,是不是nginx代理有问题?又一次扑入了开发环境去调试,结果GG了,根本不是这个问题。

异常问题

调试的过程中发现为什么开发环境一点日志都没有?这不符合道理啊?直接问运维,日志打印是什么级别,答案是INFO,那么好,改成DEBUG模式,继续调试。

可是竟然还没有日志!!!我突然间回想到上周末运维跟CTO讨论的问题,貌似开发环境不再是正常的部署,而是迁移到了docker中?我跟运维确定以后,果然,运行环境迁移到了docker,好吧,竟然都没通知。

最后去查看docker中的日志,发现如下问题:

空指针

是的,我很好奇,Returning JDBC Connection to DataSource抛出来个空指针,FontConfiguration.java:1264这是字体配置???,可JDBC的连接池需要什么字体配置么???

问题解决

本来我觉得不大可能是这种问题,但是好奇心的趋势下去找了一下。发现有一个人也有这个问题,但是他是解决Alpine缺少字体的问题,很少,我也是字体问题,是不是一样的?

造成这个问题的原因是因为docker的镜像是Alpine,他是最小化的一个docker镜像,也是最节省资源的,所以我们使用的是它,那么问题来了,Alpine是没有自带默认字体造成的。

Excel组件试图根据字体大小自动调整单元格宽度,当寻找fontconfig时发现根本找不到,返回一个Null。

项目下的Dockerfile这个文件中,新增如下的配置:

RUN apk add --update ttf-dejavu fontconfig && rm -rf /var/cache/apk/*

添加了一款名字叫dejavu的字体,重新部署,很好,完美的解决了问题。但是建议更换镜像,虽然说打包安装速度二十几秒就完成了,但是相对还是会拉低服务部署的速度。

文章发布自:笑凡尘,转载请注明出处,谢谢!