본문 바로가기
오류를 개발새발

@Value 관련 java.lang.NullPointerException: null

by 휴일이 2023. 1. 18.

 

jwtTokenProvider 라는 jwt토큰을 만드는 클래스에서

@Value(${}) 값이 null이 뜨는 참사가 발생했다

 

@Slf4j
public class JwtTokenProvider {

    @Value("${jwt.secret.key}")
    private String secretKey;
    @Value("${jwt.token.validity-in-seconds}")
    private Long validTime;

    public String createAccessToken(Authentication authentication) {
        log.info("크리에이트엑세스토큰시작");
        log.info("키내놔 = {}", secretKey);
        log.info("시간내노ㅓ = {}", validTime);
        //...

 

이렇게 로그를 찍어보니

 

null이 뜨는 현상 발생..

 

 

알고보니

@Value 는 혼자 쓰는 게 아니라

나의 Value 값이 application.properties 에 쓰여있다고

직접 가르쳐줘야 한다고 한다(...)

 

 

@PropertySource("classpath:경로") 로

나는 내가 사용하는 application.properties 의 경로를 명시해줘야한다 ㅡ.ㅡ

@PropertySource("classpath:application.properties")
public class JwtTokenParser {

 

+

하지만 그래도 되지않아서

더 찾아보니...

 

@Value 값은

스프링 컨테이너가

해당 객체를 Bean 으로 등록할 때

@Value 값을 찾아서 넣어준다고 한다

그러니까, 빈으로 등록된 객체를 사용해야한다는 것!

 

 

하지만..난!!!

내가 JwtTokenProvider 를 사용하는 곳으로 가보니

 

이렇게 스프링이 만들어주는 빈 객체가 아닌, 

new 를 이용해 내가 생성하고 있었던 것..

그래서 스프링이 @Value 값을 안 넣어주는 거를

계속 사용햇단 얘기다 ㅡ.ㅡ

 

 

빈으로 등록된 JwtTokenProvider 를 사용해보자!

 

일단 JwtTokenProvider 는 빈으로 등록된 싱글톤 객체를 사용할 거라서

JwtTokenProvider 를 사용하는

JwtAuthenticationFilter 에서

private final로 JwtTokenProvider를 선언해주고

생성자로 초기화해준다~

 

 

시큐리티 컨피그에서

스프링 빈으로 등록해준다!!

 

 

그 다음 JwtAuthenticationFilter 가 생성자로 JwtTokenProvider 를 받기 때문에

JwtAuthenticationFilter 를 생성할 때,

우리가 빈으로 등록한 JwtTokenProvider 를 넣어준다~~~

빈 등록 끝~

 

 

 

 

제대로 빈을 객체를 이용하게 만들고나니

값이 제대로 들어오는것을 볼 수 있다 ^0^/

 

 

 

하지만 머...당연하게도

 

또다른 예외가 터졋다 ㅎㅎ

해결하러 가봐야겟다 ㅎㅎ 슝

728x90