🛠 BackEnd/Spring
[InaccessibleObjectException 오류] java.time.LocalDateTime.date accessible: module java.base does not "opens java.time" to unnamed module
깸뽀
2024. 9. 9. 11:18
728x90
😈 Error
Resolved [java.lang.reflect.InaccessibleObjectException: Unable to make field private final java.time.LocalDate java.time.LocalDateTime.date accessible: module java.base does not "opens java.time" to unnamed module
🔒 InaccessibleObjectException 오류 원인
ava 16 이후로 모듈 시스템의 강화된 접근 제어로 인해 발생하는 문제이다. 특히, JSON 직렬화/역직렬화 라이브러리(Gson, Jackson 등)가 LocalDateTime 같은 Java 시간 API 클래스를 처리할 때 자주 발생한다. 이 오류는 Java 모듈 시스템이 해당 필드를 접근하지 못하도록 제한했기 때문에 발생함
🔑 해결 방법
1. Gson 대신 Jackson 사용하기
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.core.type.TypeReference;
public void saveMemberInfos(MemberInfoReqDto.Data reqDto) {
// Server에 등록되어 있는 데이터 모두 체크
List<MemberInfo> serverMemberInfos = memberRepository.findAll();
// JSON String 변환
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule()); // LocalDateTime 처리 지원
List<MemberInfo> memberInfos = mapper.readValue(
reqDto.getBrandInfoListJsonString(), new TypeReference<List<MemberInfo>>() {}
);
....
}
modulConfig는 Bean으로 등록해서 사용할 수 도 있음
@Configuration
public class ModuleConfig {
@Bean
public ObjectMapper objectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule());
return objectMapper;
}
}
2. Gson에서 LocalDateTime을 처리할 수 있도록 Adapter 등록하기
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public void public void saveMemberInfos(MemberInfoReqDto.Data reqDto) {
// Server에 등록되어 있는 데이터 모두 체크
List<MemberInfo> serverMemberInfos = memberRepositort.findAll();
// GsonBuilder로 LocalDateTime 처리를 위한 어댑터 추가
Gson gson = new GsonBuilder()
.registerTypeAdapter(LocalDateTime.class, (JsonDeserializer<LocalDateTime>)
(json, type, jsonDeserializationContext) ->
LocalDateTime.parse(json.getAsString(), DateTimeFormatter.ISO_DATE_TIME))
.create();
List<MemberInfo> memberInfos = gson.fromJson(
reqDto.getMemberInfoListJsonString(), new TypeToken<List<MemberInfo>>() {}.getType()
);
// 나머지 로직은 동일
}
📖 참고
- ObjectMapper에서 LocalDateTime이 변환되지 않는 문제: https://woo-chang.tistory.com/75
728x90