ObjectMapper writeValueAsString시 null 에러

Sol's·2023년 1월 14일
0

오류

목록 보기
11/18
post-thumbnail

로그인, 로그아웃기능을 구현하기위해 redis를 사용해서 refreshToken을 발급하려고 하는중에 에러를 만났다.

public static String createToken(Subject subject, String key) throws JsonProcessingException {
        log.info("\nHere is createToken // subject = {}\n", subject.getUserName());
        String subjectStr = objectMapper.writeValueAsString(subject);
        Claims claims = Jwts.claims().setSubject(subjectStr); //일종의 map

        return Jwts.builder()
                .setClaims(claims)
                .setIssuedAt(new Date(System.currentTimeMillis()))
                .setExpiration(new Date(System.currentTimeMillis() + ACCESS_TOKEN_EXPIRE_TIME))
                .signWith(SignatureAlgorithm.HS256,key)
                .compact()
                ;
    }

분명 log를 통해 subject에 값이 있는것을 확인했지만, objectMapper.writeValueAsString()를 하니 null 값이나와 에러가 발생한 것이다...

어디서부터 시작인걸까...

첫시도

그 이유는 Subject는 Json이 아니기 때문이다.
objectMapper의 사용 목적을 정확히 배울 수 있던것 같다.
아래와 같이 고쳐주니 오류는 해결되었다.

public static String createToken(Subject subject, String key) throws JsonProcessingException {
        log.info("\nHere is createToken // subject = {}\n", subject.getUserName());
        String subjectStr = String.valueOf(subject);
        Claims claims = Jwts.claims().setSubject(subjectStr); //일종의 map

        return Jwts.builder()
                .setClaims(claims)
                .setIssuedAt(new Date(System.currentTimeMillis()))
                .setExpiration(new Date(System.currentTimeMillis() + ACCESS_TOKEN_EXPIRE_TIME))
                .signWith(SignatureAlgorithm.HS256,key)
                .compact()
                ;
    }

진짜문제

하지만 이렇게하면 Claims에는 String이 들어가게된다.
Claims는 Map형태로 되어있기때문에 key와 value를 넣어야 한다.

아래코드처럼 Subject의 값들을 key,value형식으로 넣어주어서 오류를 해결하였다.

public static String createToken(Subject subject, String key, Long expiredTime) throws JsonProcessingException {
        Claims claims = Jwts.claims(); //일종의 map
        claims.put("userName", subject.getUserName());
        claims.put("accountId", subject.getAccountId());
        claims.put("type", subject.getType());

        return Jwts.builder()
                .setClaims(claims)
                .setIssuedAt(new Date(System.currentTimeMillis()))
                .setExpiration(new Date(System.currentTimeMillis() + expiredTime))
                .signWith(SignatureAlgorithm.HS256,key)
                .compact()
                ;
    }

글로보면 간단해 보이지만, 엄청 오래걸렸던 오류 해결이였다

profile
배우고, 생각하고, 행동해라

0개의 댓글