Java服务部署到Linux服务器验证码接口报错

org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.InternalError: java.lang.reflect.InvocationTargetException
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1085)
        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963)
        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
        at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:655)
        at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
        at com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:114)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
        at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
        at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
        at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
        at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360)
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399)
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:890)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1789)
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
        at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
        at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.lang.InternalError: java.lang.reflect.InvocationTargetException
        at java.desktop/sun.font.FontManagerFactory$1.run(FontManagerFactory.java:86)
        at java.base/java.security.AccessController.doPrivileged(Native Method)
        at java.desktop/sun.font.FontManagerFactory.getInstance(FontManagerFactory.java:74)
        at java.desktop/sun.font.SunFontManager.getInstance(SunFontManager.java:247)
        at java.desktop/sun.font.FontDesignMetrics.getMetrics(FontDesignMetrics.java:265)
        at java.desktop/sun.java2d.SunGraphics2D.getFontMetrics(SunGraphics2D.java:856)
        at com.wf.captcha.SpecCaptcha.graphicsImage(SpecCaptcha.java:76)
        at com.wf.captcha.SpecCaptcha.out(SpecCaptcha.java:45)
        at com.wf.captcha.base.Captcha.toBase64(Captcha.java:127)
        at com.wf.captcha.SpecCaptcha.toBase64(SpecCaptcha.java:50)
        at cn.ls.module.mis.service.impl.LoginServiceImpl.captcha(LoginServiceImpl.java:80)
        at cn.ls.module.mis.controller.LoginController.getAuthCode(LoginController.java:46)
        at cn.ls.module.mis.controller.LoginController$$FastClassBySpringCGLIB$$ebb3de28.invoke(<generated>)
        at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:793)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763)
        at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763)
        at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708)
        at cn.ls.module.mis.controller.LoginController$$EnhancerBySpringCGLIB$$c754068f.getAuthCode(<generated>)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
        at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)
        at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)
        at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1070)
        ... 46 more
Caused by: java.lang.reflect.InvocationTargetException
        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
        at java.desktop/sun.font.FontManagerFactory$1.run(FontManagerFactory.java:84)
        ... 78 more
Caused by: java.lang.NullPointerException
        at java.desktop/sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1262)
        at java.desktop/sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:225)
        at java.desktop/sun.awt.FontConfiguration.init(FontConfiguration.java:107)
        at java.desktop/sun.awt.X11FontManager.createFontConfiguration(X11FontManager.java:719)
        at java.desktop/sun.font.SunFontManager$2.run(SunFontManager.java:367)
        at java.base/java.security.AccessController.doPrivileged(Native Method)
        at java.desktop/sun.font.SunFontManager.<init>(SunFontManager.java:312)
        at java.desktop/sun.awt.FcFontManager.<init>(FcFontManager.java:35)
        at java.desktop/sun.awt.X11FontManager.<init>(X11FontManager.java:56)
        ... 83 more

这是一个字体相关的 Java 运行时错误。问题出现在生成验证码时,Java 无法加载系统字体,导致了 NullPointerException。这通常发生在 Linux 服务器或缺少中文字体的环境中

cd /usr/share/fonts
如没有,创建文件夹
sudo mkdir /usr/share/fonts


# 1. 检查系统版本
cat /etc/redhat-release

# 2. 更新yum缓存
sudo yum clean all
sudo yum makecache

# 3. 安装fontconfig
sudo yum install -y fontconfig

# 4. 安装常用字体
sudo yum install -y dejavu-sans-fonts dejavu-serif-fonts

# 5. 重新生成字体缓存
fc-cache -fv

1、打开「终端」导航到  `/usr/share/fonts` 目录;如果没有,就创建一个

cd /usr/share/fonts
或者
sudo mkdir /usr/share/fonts

2、Linux给`/usr/share/fonts` 文件夹赋予root权限

在Linux中,给某个文件或文件夹赋予root权限,通常意味着更改其所有者为root用户。你可以使用chown命令来更改所有者。

以下是一个命令示例,它会将名为 '/usr/share/fonts' 的文件夹的所有者更改为root用户:

sudo chown root:root /usr/share/fonts

这里,/path/to/example_folder是你要更改权限的文件夹的路径。root:部分指定了所有者,而root指定了组。

如果你还想要给文件夹内的所有文件和子文件夹赋予相同的权限,可以使用-R(递归)选项:

sudo chown -R root:root /path/to/example_folder

3、将字体文件上传到 Linux 服务器。你可以使用 SCP 或 SFTP 等工具将字体文件从本地计算机上传到 Linux 服务器上  Font字体下载

或者使用以下命令将下载好的字体文件(ttf、otf 等)复制到 `fonts` 目录中:

sudo cp ~/Downloads/*.ttf /usr/share/fonts

4、运行以下命令更新字体缓存,让系统识别新安装的字体:

sudo fc-cache -f -v

如果该命令不存在,执行以下命令

sudo fc-cache -f -v 
sudo: fc-cache:找不到命令

报错解释: 这个错误表明sudo命令试图以超级用户权限执行fc-cache命令,但是系统中没有找到fc-cache这个命令。

fc-cache是一个用于字体配置的工具,通常它是fontconfig包的一部分,属于字体渲染和管理工具。

解决方法: 确认你的系统上是否安装了fontconfig包。如果没有安装,你需要根据你的操作系统安装它。

【1】对于Debian/Ubuntu系统,可以使用以下命令安装:

sudo apt-get update sudo apt-get install fontconfig

【2】对于Red Hat/CentOS系统,可以使用以下命令安装:

sudo yum install fontconfig

【3】对于Fedora系统,可以使用以下命令安装:

sudo dnf install fontconfig

【4】对于Arch Linux,可以使用以下命令安装:

sudo pacman -S fontconfig

【5】对于macOS,如果你使用Homebrew,可以使用以下命令安装: brew install fontconfig

如果fontconfig已经安装,可能是fc-cache不在环境变量的PATH中。可以尝试直接使用完整路径运行fc-cache,例如: sudo /usr/bin/fc-cache -f -v 或者,检查fc-cache的实际安装位置并将其添加到PATH环境变量中。

如果你不确定fc-cache的确切位置,可以使用find命令来搜索它: sudo find / -name fc-cache 2>/dev/null

找到fc-cache后,使用其完整路径运行命令

sudo apt-get update
sudo apt-get install fontconfig

再重新执行更新命

sudo fc-cache -f -v

5、检查是否安装成功

字体安装完成后,可以通过 `fc-list` 命令验证新字体是否成功安装

fc-list | grep "思源黑体"
或者
fc-list

可参考:

在当前的Linux上并安装字体(这里以安装中文字体为例) - 小年的西瓜 - 博客园

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。