JwtProcessor NullPointerException

Kim jisu·2024년 12월 16일
0

 Debugging Note

목록 보기
4/37
<!doctype html><html lang="ko"><head><title>HTTP 상태 500 – 내부 서버 오류
...
</title>HTTP 상태 500 – 내부 서버 오류</h1>
<hr class="line" ><p><b>타입</b> 예외 보고</p><p><b>메시지</b> 
Cannot invoke &quot;org.scoula.security.util.JwtProcessor.generateToken(String)&quot; 
because &quot;this.jwtProcessor&quot; is null</p>
<p><b>설명</b> 서버가, 해당 요청을 충족시키지 못하게 하는 예기치 않은 조건을 맞닥뜨렸습니다.</p>
<p><b>예외</b></p><pre>java.lang.NullPointerException: Cannot invoke &quot;org.scoula.security.util.JwtProcessor.generateToken(String)&quot; because &quot;this.jwtProcessor&quot; is null
...

이 오류는 LoginSuccessHandler 클래스에서 JwtProcessor 객체가 null 상태이기 때문에 발생한 NullPointerException 오류. JwtProcessor 객체를 사용하려고 시도했지만 초기화되지 않았거나 의존성 주 제대로 이루어지지 않았을 때 발생할 수 있습니다.

package org.scoula.security.handler;

import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j;
import org.scoula.security.account.domain.CustomUser;
import org.scoula.security.account.dto.AuthResultDTO;
import org.scoula.security.account.dto.UserInfoDTO;
import org.scoula.security.util.JsonResponse;
import org.scoula.security.util.JwtProcessor;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
import org.springframework.stereotype.Component;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Log4j
@Component
@RequiredArgsConstructor
public class LoginSuccessHandler implements AuthenticationSuccessHandler {

    private final JwtProcessor jwtProcessor;

    private AuthResultDTO makeAuthResult(CustomUser user) {
        String username = user.getUsername();
        // 토큰 생성
        String token = jwtProcessor.generateToken(username);
        // 토큰 + 사용자 기본 정보 (사용자명, ...)를 묶어서 AuthResultDTO 구성
        return new AuthResultDTO(token, UserInfoDTO.of(user.getMember()));
    }

    @Override
    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
                                        Authentication authentication) throws IOException, ServletException {
        // 인증 결과 Principal
        CustomUser user = (CustomUser) authentication.getPrincipal();
        // 인증 성공 결과를 JSON으로 직접 응답
        AuthResultDTO result = makeAuthResult(user);
        JsonResponse.send(response, result);
    }

}

주요 변경 사항:
JwtProcessor 필드를 final로 선언하였습니다. 이렇게 하면 @RequiredArgsConstructor 어노테이션에 의해 JwtProcessor 필드에 대한 생성자가 자동으로 생성되고, Spring이 이 필드를 자동으로 주입하게 됩니다.

LoginSuccessHandler 클래스에서 JwtProcessor가 제대로 주입될 수 있게 되었기 때문에, NullPointerException 문제를 해결할 수 있었습니다.

profile
Dreamer

0개의 댓글