Linux
XSSFWorkbook 생성 시 FontConfiguration에서 NullPointerException이 발생할 때
rw-
2023. 11. 1. 09:54
728x90
특정 서버에서만 XSSFWorkbook생성 시 FontConfiguration에서 NullPointerException이 발생
오류 내용 및 원인
특정 서버에서만 XSSFWorkbook.createSheet()을 했을 때 아래와 같은 예외가 발생
2023-10월-31 12:44:58 오후 [http-nio-19080-exec-2] DEBUG org.springframework.web.servlet.DispatcherServlet - Could not complete request
java.lang.NullPointerException: null
at sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264) ~[?:1.8.0_342]
at sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:219) ~[?:1.8.0_342]
at sun.awt.FontConfiguration.init(FontConfiguration.java:107) ~[?:1.8.0_342]
at sun.awt.X11FontManager.createFontConfiguration(X11FontManager.java:774) ~[?:1.8.0_342]
at sun.font.SunFontManager$2.run(SunFontManager.java:441) ~[?:1.8.0_342]
at java.security.AccessController.doPrivileged(Native Method) ~[?:1.8.0_342]
at sun.font.SunFontManager.<init>(SunFontManager.java:386) ~[?:1.8.0_342]
at sun.awt.FcFontManager.<init>(FcFontManager.java:35) ~[?:1.8.0_342]
at sun.awt.X11FontManager.<init>(X11FontManager.java:57) ~[?:1.8.0_342]
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:1.8.0_342]
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[?:1.8.0_342]
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[?:1.8.0_342]
at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[?:1.8.0_342]
at java.lang.Class.newInstance(Class.java:442) ~[?:1.8.0_342]
at sun.font.FontManagerFactory$1.run(FontManagerFactory.java:83) ~[?:1.8.0_342]
at java.security.AccessController.doPrivileged(Native Method) ~[?:1.8.0_342]
at sun.font.FontManagerFactory.getInstance(FontManagerFactory.java:74) ~[?:1.8.0_342]
at java.awt.Font.getFont2D(Font.java:491) ~[?:1.8.0_342]
at java.awt.Font.canDisplayUpTo(Font.java:2064) ~[?:1.8.0_342]
at java.awt.font.TextLayout.singleFont(TextLayout.java:470) ~[?:1.8.0_342]
at java.awt.font.TextLayout.<init>(TextLayout.java:531) ~[?:1.8.0_342]
at org.apache.poi.xssf.usermodel.helpers.ColumnHelper.getColumnWidth(ColumnHelper.java:326) ~[poi-ooxml-3.7.jar:3.7]
at org.apache.poi.xssf.usermodel.XSSFSheet.autoSizeColumn(XSSFSheet.java:337) ~[poi-ooxml-3.7.jar:3.7]
at org.apache.poi.xssf.usermodel.XSSFSheet.autoSizeColumn(XSSFSheet.java:320) ~[poi-ooxml-3.7.jar:3.7]
at kr.go.nier.fds.sys.csr.controller.CsrController.retrieveCsrExcelInfo(CsrController.java:433) ~[classes/:?]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_342]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_342]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_342]
at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_342]
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-4.3.22.RELEASE.jar:4.3.22.RELEASE]
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133) ~[spring-web-4.3.22.RELEASE.jar:4.3.22.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97) ~[spring-webmvc-4.3.
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:849) ~[spring-webmvc-4
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:760) ~[spring-webmvc-4.3.22
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) ~[spring-webmvc-4.3.22.RELEASE.jar:4.3.22.
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967) ~[spring-webmvc-4.3.22.RELEASE.jar:4.3.22.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901) ~[spring-webmvc-4.3.22.RELEASE.jar:4.3.22.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) [spring-webmvc-4.3.22.RELEASE.jar:4.3.22.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) [spring-webmvc-4.3.22.RELEASE.jar:4.3.22.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:670) [servlet-api.jar:4.0.FR]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) [spring-webmvc-4.3.22.RELEASE.jar:4.3.22.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:779) [servlet-api.jar:4.0.FR]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) [catalina.jar:9.0.68]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) [catalina.jar:9.0.68]
확인 결과, JDK에서 POI API를 호출 시 시스템 폰트를 참조하는데, 해당 서버에는 사용 가능한 폰트가 없었기 때문에 발생
해결 방법
fontconfig 디펜던시와 폰트를 설치해주고, tomcat 서비스를 재기동 해주니 해결
아래는 fontconfig 디펜던시와 폰트 재설치 방법
CentOS 7 기준
wget https://rpmfind.net/linux/centos/7.9.2009/os/x86_64/Packages/fontconfig-2.13.0-4.3.el7.x86_64.rpm
wget https://rpmfind.net/linux/centos/7.9.2009/os/x86_64/Packages/dejavu-sans-fonts-2.33-6.el7.noarch.rpm
wget https://rpmfind.net/linux/centos/7.9.2009/os/x86_64/Packages/fontpackages-filesystem-1.44-8.el7.noarch.rpm
rpm -Uvh fontconfig-2.13.0-4.3.el7.x86_64
rpm -Uvh dejavu-sans-fonts-2.33-6.el7.noarch
rpm -Uvh fontpackages-filesystem-1.44-8.el7.noarch
CentOS 6 기준
https://rpm.pbone.net/info_idpl_31336258_distro_centos_6_com_dejavu-sans-fonts-2.33-1.el6.noarch.rpm.html
wget ftp://ftp.pbone.net/mirror/vault.centos.org/6.10/os/i386/Packages/dejavu-sans-fonts-2.33-1.el6.noarch.rpm
rpm -Uvh dejavu-sans-fonts-2.33-1.el6.noarch.rpm
728x90
반응형