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 타입 필드 존재JDK 실행 시 아래 JVM 인자를 추가하여 해당 모듈 패키지를 열어주는 방식으로 해결할 수 있습니다.
--add-opens java.base/java.time=ALL-UNNAMED
bootRun {
jvmArgs = ["--add-opens", "java.base/java.time=ALL-UNNAMED"]
}
위 옵션을 적용하여 해당 문제를 해결할 수 있습니다.

감사합니다.