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