You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot登录时UserRepository空指针异常问题求助

登录时出现NullPointerException:UserRepository为null

使用正确的用户名和密码登录系统时,控制台抛出空指针异常,提示无法调用customlogin.repositories.UserRepository.findByUsername(String)方法,原因是this.userRepository为null。

错误栈信息

Caused by: java.lang.NullPointerException: Cannot invoke "customlogin.repositories.UserRepository.findByUsername(String)" because "this.userRepository" is null
at customlogin.service.CustomUserDetailsServices.loadUserByUsername(CustomUserDetailsServices.java:26) ~[classes/:na]
at org.springframework.security.authentication.dao.DaoAuthenticationProvider.retrieveUser(DaoAuthenticationProvider.java:103) ~[spring-security-core-6.2.1.jar:6.2.1]
... 65 common frames omitted

相关代码

UserServiceImpl

package customlogin.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;

import customlogin.dto.UserDto;
import customlogin.model.User;
import customlogin.repositories.UserRepository;


@Service
public class UserServiceImpl  implements UserService{
    
    
    @Autowired
    PasswordEncoder passwordEncoder;
    
    private UserRepository userRepository;
    
    

    public UserServiceImpl(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @Override
    public User findByUsername(String username) {
        
        return userRepository.findByUsername(username);
    }

    @Override
    public User save(UserDto userDto) {
        User user = new User(userDto.getFullname(), userDto.getDateofbirth(), userDto.getGender(), userDto.getAddress(), userDto.getCity(), userDto.getState(), userDto.getUsername(),passwordEncoder.encode(userDto.getPassword()));
        return userRepository.save(user);
    }

}

UserService

package customlogin.service;

import customlogin.dto.UserDto;
import customlogin.model.User;

public interface UserService {
    
    User findByUsername(String username);
    User save(UserDto userDto);

}

UserRepository

package customlogin.repositories;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import customlogin.model.User;


@Repository
public interface UserRepository  extends JpaRepository<User, Long>{
    
    User findByUsername(String username);

}

问题分析与解决

核心原因

错误栈指向CustomUserDetailsServices类的loadUserByUsername方法,说明该类中的userRepository(或依赖的UserService)未被Spring正确注入,导致调用时为null。

解决步骤

  1. 检查CustomUserDetailsServices的Spring管理与依赖注入

    • 确保类上添加@Service或@Component注解,让Spring容器接管实例创建
    • 使用构造注入方式引入依赖(Spring官方推荐),示例如下:
      @Service
      public class CustomUserDetailsServices implements UserDetailsService {
          private final UserRepository userRepository;
      
          // 构造注入
          public CustomUserDetailsServices(UserRepository userRepository) {
              this.userRepository = userRepository;
          }
      
          @Override
          public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
              User user = userRepository.findByUsername(username);
              // 实现用户信息转换为UserDetails的逻辑
              // ...
          }
      }
      
    • 若依赖的是UserService,则注入UserService即可:
      @Service
      public class CustomUserDetailsServices implements UserDetailsService {
          private final UserService userService;
      
          public CustomUserDetailsServices(UserService userService) {
              this.userService = userService;
          }
      
          @Override
          public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
              User user = userService.findByUsername(username);
              // 后续逻辑
              // ...
          }
      }
      
  2. 确保Spring扫描范围正确

    • 检查项目启动类(标注@SpringBootApplication的类)所在包是否包含customlogin及其子包,若不在同一层级,需添加@ComponentScan指定扫描路径:
      @SpringBootApplication
      @ComponentScan(basePackages = "customlogin")
      public class YourApplication {
          public static void main(String[] args) {
              SpringApplication.run(YourApplication.class, args);
          }
      }
      
  3. 验证Repository的扫描

    • 确认UserRepository上的@Repository注解存在,且Spring Data JPA的自动扫描功能正常(@SpringBootApplication默认包含@EnableJpaRepositories)

内容的提问来源于stack exchange,提问作者Amit Yadav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 22:17:52