본문 바로가기
🛠 BackEnd/Spring

[InaccessibleObjectException 오류] java.time.LocalDateTime.date accessible: module java.base does not "opens java.time" to unnamed module

by 깸뽀 2024. 9. 9.
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()
    );
    
    // 나머지 로직은 동일
}

 

 

 

📖 참고

728x90

댓글