java.lang.NullPointerException: Cannot invoke [this.Object] is null

한지연·2023년 6월 28일
0

문제상황

  • DB에 존재하는 user를 가져오지 못해 NPE 발생

지금 흐름을 살펴보자면 springsecurity를 사용하기 때문에 유저가 로그인 시도 -> security가 낚아챔 -> UserDetailsService 실행 -> loadUserByUsername() 실행하여 UserDetails 리턴 하는 상황이다.

코드

  • controller
    @PostMapping("/login")
    public User login(@RequestBody LoginDto loginDto) {
        User user = userRepository.findByUserIdAndPwd(loginDto);
        
        if(user == null) {
            throw new UserNotFoundException(String.format("ID[%s] not found", loginDto.getUserId()));
        }

        return user;
    }
  • config
public class WebSecurityConfig{

    private final PrincipleOauth2UserService principleOauth2UserService;

    private final CustomBcryptEncoder bcryptEncoder;

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws  Exception {
        http.csrf((csrf) -> csrf.disable());
        http.authorizeHttpRequests((authorizeHttpRequests) ->
                        authorizeHttpRequests
                                .requestMatchers("/mypage/**").authenticated()
                                .anyRequest().permitAll()
                ).formLogin(formLogin ->
                formLogin.loginPage("/loginForm")
                        .usernameParameter("username")
                        .passwordParameter("password")
                        .loginProcessingUrl("/login")
                        .defaultSuccessUrl("/")
                        .permitAll())
                .oauth2Login(oauth2Login -> oauth2Login.loginPage("/loginForm")
                        .userInfoEndpoint(userInfoEndpointConfig ->
                                userInfoEndpointConfig.userService(principleOauth2UserService))
                );
        return http.build();
    }
}
  • DetailsService
@Service
@RequiredArgsConstructor
public class PrincipalDetailsService implements UserDetailsService {

    private final UserRepository userRepository;

    @Override
    public UserDetails loadUserByUsername(String userId) throws UsernameNotFoundException {

        User user = userRepository.findByUserId(userId);

        return new PrincipalDetails(user);
    }

}

문제 해결

  • 아.... 쓰다 보니 문제를 바로 알아차려 버렸다. config에 formLogin.loginPage("/loginForm") .usernameParameter("username")로 적은 usernameParameter를 userId로 바꿨어야 했다 왜 저 기본적인 걸 계속 놓치고 있었는지?...
profile
배우고 활용하는 것을 즐기는 개발자, 한지연입니다!

0개의 댓글