본문 바로가기
개발관련/JAVA

JAVA) apache poi - SXSSF NullPointer Exception 오류 해결방법

by joa-yo 2021. 8. 2.
반응형

환경

AWS (리눅스, 도커)

SPRING BOOT

JAVA 1.8

 

 

문제상황

apache poi를 사용하던 중, 대용량 엑셀 다운로드를 구현할 필요가 있어, XSSF에서 SXSSF로 변경하였다. 그런데, 갑자기 발생하는 NullPointerException때문에 고생했다..

 

Workbook workbook = new SXSSFWorkbook(SXSSFWorkbook.DEFAULT_WINDOW_SIZE);
sheet = workbook.createSheet("시트이름");

 

두번째라인을 실행하면서 에러가 발생했다.

개발할 때는 윈도우에서 개발했기 때문에 별문제 없이 돌아갔지만, AWS에서 사용하고 있는 docker에서는 폰트 파일이 없어서 발생했다.

 

XSSF를 사용했을 때는 문제가 발생하지 않았지만, SXSSF로 변경하면서 발생하는 오류였다. 폰트를 가져오는 방식이 다른 것 같다.

 

 

원인파악

GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames()

위의 코드를 통해서 시스템 글꼴을 모두 찍어보려했지만, 이 코드가 실행되는라인에서 에러가 발생...! 시스템 폰트를 불러오는 데서 발생하는 오류가 확실했다.

 

발생하는 오류는 아래와 같다.

 

java.lang.NullPointerException
        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 sun.java2d.SunGraphicsEnvironment.getFontManagerForSGE(SunGraphicsEnvironment.java:201)
        at sun.java2d.SunGraphicsEnvironment.getAvailableFontFamilyNames(SunGraphicsEnvironment.java:235)
        at sun.java2d.SunGraphicsEnvironment.getAvailableFontFamilyNames(SunGraphicsEnvironment.java:263)
        at sun.java2d.HeadlessGraphicsEnvironment.getAvailableFontFamilyNames(HeadlessGraphicsEnvironment.java:94)
        .... 이하 생략

 

 

 

해결방법

docker image에 폰트파일을 추가해주어, 자동적으로 폰트파일이 설치될 수 있도록 해주자.

아래의 코드를 참조해주세요.

 

RUN apk update
RUN apk add --no-cache fontconfig ttf-dejavu

 

그런데, AWS(리눅스) 서버에는 폰트가 설치되어 있었음에도 발생하는 오류였으므로, 꼭 도커 이미지에 설치해주어야 한다..!

반응형

댓글