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
'🛠 BackEnd > Spring' 카테고리의 다른 글
[ Spring ] Spring Batch 이해와 도메인 용어 (1) | 2022.12.03 |
---|---|
[ Spring ] Table 'batch.batch_job_instance' doesn't exist / 에러 해결방법 (SpringBoot 2.5 이상) (0) | 2022.11.30 |
[ Spring ] @Scheduled 스케줄러 사용법 (0) | 2022.11.02 |
[ Spring ] - Spring Security 인증 절차 인터페이스 UserDetails, UserDetailsService (0) | 2022.10.09 |
[ Spring ] Controller, Service Repository 코드 분리 (2/2) (1) | 2022.10.08 |
댓글