Java/오류 해결

[Java 오류] java.lang.ClassCastException: class java.lang.Integer cannot be cast to class java.lang.Long, class java.util.ArrayList cannot be cast to class java.time.LocalDateTime

HSY_mumu 2022. 10. 13. 14:23
728x90

1. 문제 상황

// claim 정보 -> Member 로 변환
public static Member fromJwtClaims(Map<String, Object> jwtClaims) {
	// 오류 발생 코드1
    long id = (Long) jwtClaims.get("id");
    // 오류 발생 코드2
    LocalDateTime createDate = (LocalDateTime) jwtClaims.get("createDate");
    LocalDateTime modifyDate = (LocalDateTime) jwtClaims.get("modifyDate");
    // 끝
    String username = (String) jwtClaims.get("username");
    String email = (String) jwtClaims.get("email");

    return Member.builder()
            .id(id)
            .createDate(createDate)
            .modifyDate(modifyDate)
            .username(username)
            .email(email)
            .build();
}

1) 위 코드에서 jwtClaims.get("id")Integer 인데 Long 으로 변환하려고 하니 오류가 났다.

java.lang.ClassCastException: class java.lang.Integer cannot be cast to class java.lang.Long (java.lang.Integer and java.lang.Long are in module java.base of loader 'bootstrap')

 

2) 위 코드에서 jwtClaims.get("createDate") ArrayList 인데 LocalDateTime 으로 변환하려고 하니 오류가 났다.

java.lang.ClassCastException: class java.util.ArrayList cannot be cast to class java.time.LocalDateTime (java.util.ArrayList and java.time.LocalDateTime are in module java.base of loader 'bootstrap')

 

2. 해결방법

// claim 정보 -> Member 로 변환
public static Member fromJwtClaims(Map<String, Object> jwtClaims) {
    // Integer -> int -> long
    long id = (long) (int) jwtClaims.get("id");
    // ArrayList -> LocalDateTime
    LocalDateTime createDate = Util.date.bitsToLocalDateTime((List<Integer>)jwtClaims.get("createDate"));
    LocalDateTime modifyDate = Util.date.bitsToLocalDateTime((List<Integer>)jwtClaims.get("modifyDate"));
    String username = (String) jwtClaims.get("username");
    String email = (String) jwtClaims.get("email");

    return Member.builder()
            .id(id)
            .createDate(createDate)
            .modifyDate(modifyDate)
            .username(username)
            .email(email)
            .build();
}

1) 1번 문제 해결

Integer -> int -> long 순서로 변환시킨다

 

2) 2번 문제 해결

// ArrayList -> LocalDateTime 변환
public static LocalDateTime bitsToLocalDateTime(List<Integer> bits) {
    return LocalDateTime.of(bits.get(0), bits.get(1), bits.get(2), bits.get(3), bits.get(4), bits.get(5), bits.get(6));
}

- LocalDateTime.of()를 이용해 ArrayList 요소들로부터 LocalDateTime 객체를 만드는 위와 같은 함수를 만들어 사용한다

 

(참고)

public static LocalDateTime of(int year, int month, int dayOfMonth, int hour, int minute, int second, int nanoOfSecond) {
    LocalDate date = LocalDate.of(year, month, dayOfMonth);
    LocalTime time = LocalTime.of(hour, minute, second, nanoOfSecond);
    return new LocalDateTime(date, time);
}

 

https://stackoverflow.com/questions/58056944/java-lang-integer-cannot-be-cast-to-java-lang-long

 

java.lang.Integer cannot be cast to java.lang.Long

I'm supposed to receive long integer in my web service. long ipInt = (long) obj.get("ipInt"); When I test my program and put ipInt value = 2886872928, it give me success. However, when I test my

stackoverflow.com

 

728x90