这里写目录标题
- ruoyi-vue项目部署到服务器验证码接口报500的解决方案
- 问题回顾
- 报错信息
- 分析和解决方案
- 解决方案
ruoyi-vue项目部署到服务器验证码接口报500的解决方案
问题回顾
最近手上有个项目是基于ruoyi-vue开发的,本地运行的好好地,一部署到服务器上,运行成功,一访问就发现验证码接口报错!!!就有了如下画面:
测试:验证码怎么不显示?报错了呀!
你:😳纳尼?我本地好好的呀,什么也没改怎么报错了呢!!!
运维:包是你打包给我的呀!
你:😭你把服务器项目错误日志发我看下吧!
报错信息
验证码接口返回错误响应如下:
{
"msg": null,
"code": 500
}
服务器项目错误日志如下:
[XNIO-1 task-1] ERROR c.h.f.w.e.GlobalExceptionHandler - [handleRuntimeException,93] - 请求地址'/captchaImage',发生未知异常.
java.lang.NullPointerException: null
at sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264)
at sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:219)
at sun.awt.FontConfiguration.init(FontConfiguration.java:107)
at sun.awt.X11FontManager.createFontConfiguration(X11FontManager.java:774)
at sun.font.SunFontManager$2.run(SunFontManager.java:441)
at java.security.AccessController.doPrivileged(Native Method)
at sun.font.SunFontManager.<init>(SunFontManager.java:386)
at sun.awt.FcFontManager.<init>(FcFontManager.java:35)
at sun.awt.X11FontManager.<init>(X11FontManager.java:57)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at java.lang.Class.newInstance(Class.java:442)
at sun.font.FontManagerFactory$1.run(FontManagerFactory.java:83)
at java.security.AccessController.doPrivileged(Native Method)
at sun.font.FontManagerFactory.getInstance(FontManagerFactory.java:74)
at java.awt.Font.getFont2D(Font.java:491)
at java.awt.Font.access$000(Font.java:224)
at java.awt.Font$FontAccessImpl.getFont2D(Font.java:228)
at sun.font.FontUtilities.getFont2D(FontUtilities.java:200)
at sun.font.StandardGlyphVector.initFontData(StandardGlyphVector.java:1126)
at sun.font.StandardGlyphVector.init(StandardGlyphVector.java:1115)
at sun.font.StandardGlyphVector.<init>(StandardGlyphVector.java:167)
at java.awt.Font.createGlyphVector(Font.java:2549)
at com.google.code.kaptcha.text.impl.DefaultWordRenderer.renderWord(DefaultWordRenderer.java:67)
at com.google.code.kaptcha.impl.DefaultKaptcha.createImage(DefaultKaptcha.java:43)
分析和解决方案
根据报错信息,可以看出发生了NullPointerException异常,具体原因可能是在创建验证码图片时出现了空指针异常。报错信息中涉及到了字体管理相关的代码,所以极可能是在获取字体信息时出现了问题。
我们看到报错信息,可以看出问题出现在获取字体版本信息时:
at sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264)
所以我们可以很明显的确定,服务器环境缺少相关字体文件或字体配置文件,导致无法获取字体版本信息;解决方法也很简单,缺少字体我们把字体安装上不就完事了,立马开干!
解决方案
这里我们操作的服务器是Centos7.9
我们先安装下字体库
# 更新软件包列表
sudo yum update
# 安装fontconfig字体库
sudo yum install fontconfig
# 安装ttf-dejavu字体
sudo yum install dejavu-sans-fonts
安装完成,我们查看下已经安装的字体库列表
fc-list
通过上面的命令我们可以看到刚安装上的DejaVu相关字体
安装完字体后,我们需要重启下项目服务,然后访问服务的验证码接口/captchaImage
响应结果:
{
"msg": "操作成功",
"img": "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",
"code": 200,
"captchaEnabled": true,
"uuid": "39ca65c4404a4bd8ab10f6671d4506a1"
}
到这里,完美解决!!!