Jackson으로 Duration 역직렬화 시 InaccessibleObjectException 오류 해결 방법 [Java 17 이상]

밀초·2025년 4월 7일
0

spring

목록 보기
24/34

JDK 17 환경에서 java.time.Duration이 포함된 JSON을 Jackson(ObjectMapper)로 역직렬화할 때 다음과 같은 오류가 발생했습니다.


에러 메시지

java.lang.reflect.InaccessibleObjectException: Unable to make field private final long java.time.Duration.seconds accessible: module java.base does not "opens java.time" to unnamed module

원인

java.base 모듈이 java.time 패키지를 unnamed module(Jackson 등)에게 열지 않아 리플렉션 접근(setAccessible(true))이 거부되며 발생한 예외입니다.

"JDK 16 이상부터 Java Platform Module System(JPMS)이 기본 활성화되어, Java의 core 모듈(java.base, java.time 등)은 외부 리플렉션 접근을 허용하지 않습니다. Jackson은 내부 필드(Duration.seconds)에 리플렉션으로 접근하려다 실패합니다."

라고 어려운 말들이 너무 많이 나옵니다. 그러나 근본적인 원인은 아래와 같습니다.

쉽게 말해, 이 문제는 Jackson과 JDK 17+ 모듈 시스템 간의 구조적 충돌

이 문제는 주로 아래와 같은 상황에서 발생한다고 합니다.

  • spring-authorization-server 사용 중
  • RegisteredClient 객체에 Duration 타입 필드 존재
  • JSON → 객체 역직렬화 시

해결 방법

1. JVM 옵션 추가

JDK 실행 시 아래 JVM 인자를 추가하여 해당 모듈 패키지를 열어주는 방식으로 해결할 수 있습니다.

  • IntelliJ VM Options
--add-opens java.base/java.time=ALL-UNNAMED
  • Gradle (bootRun)
bootRun { 
    jvmArgs = ["--add-opens", "java.base/java.time=ALL-UNNAMED"] 
}

위 옵션을 적용하여 해당 문제를 해결할 수 있습니다.

감사합니다.

profile
안녕하세요 :) 성장하는 개발자 밀초입니다 !

0개의 댓글