Spring Boot登录时UserRepository空指针异常问题求助
使用正确的用户名和密码登录系统时,控制台抛出空指针异常,提示无法调用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。
解决步骤
检查
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); // 后续逻辑 // ... } }
- 确保类上添加
确保Spring扫描范围正确
- 检查项目启动类(标注
@SpringBootApplication的类)所在包是否包含customlogin及其子包,若不在同一层级,需添加@ComponentScan指定扫描路径:@SpringBootApplication @ComponentScan(basePackages = "customlogin") public class YourApplication { public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } }
- 检查项目启动类(标注
验证Repository的扫描
- 确认
UserRepository上的@Repository注解存在,且Spring Data JPA的自动扫描功能正常(@SpringBootApplication默认包含@EnableJpaRepositories)
- 确认
内容的提问来源于stack exchange,提问作者Amit Yadav

