本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《 阿里云开发者社区用户服务协议 》和 《 阿里云开发者社区知识产权保护指引 》。如果您发现本社区中有涉嫌抄袭的内容,填写 侵权投诉表单 进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
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:431)
  at java.security.AccessController.doPrivileged(Native Method)
  at sun.font.SunFontManager.<init>(SunFontManager.java:376)
  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:180)
  at sun.java2d.SunGraphics2D.checkFontInfo(SunGraphics2D.java:669)
  at sun.java2d.SunGraphics2D.getFontInfo(SunGraphics2D.java:830)
  at sun.java2d.pipe.GlyphListPipe.drawString(GlyphListPipe.java:50)
  at sun.java2d.SunGraphics2D.drawString(SunGraphics2D.java:2928)
  ………………

这个问题网上答案已经非常多了——

OpenJDK比OracleJDK简化了一些功能,所以后端绘制验证码所要用到Java的AWT组件就被简化了,结果报出空指针。

问题出现了,现在有三种解决思路:

  • 1、修改代码,后端只生成验证码内容,具体绘制交给前端
  • 2、更换Docker镜像为 OracleJDK
  • 3、基于操作系统安装FontConfig组件
  • 综合比较快捷的是第三种方式:

  • 1、在centos7系统安装FontConfig
  • 2、安装字体 ttf-dejavu

  • 下载字体 ttf-dejavu https://packages.msys2.org/package/mingw-w64-x86_64-ttf-dejavu (失效自行查找)
  • 上传字体:将 字体文件打包上传到服务器 /usr/share/fonts 目录,解压
  •