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

Spring Security依赖环境下UserRepository空指针异常求助

问题解决:Cannot invoke "com.smart.repository.UserRepository.getUserByUsername(String)" because "this.userRepository" is null

错误根源

UserDetailsServiceImpl里的userRepository字段没有被Spring容器注入,调用方法时自然会触发空指针异常。另外还要确保UserRepository能被Spring正确识别为数据访问组件。

修复步骤

1. 给UserRepository添加@Repository注解

Spring需要通过这个注解识别这是一个数据仓库Bean,才能纳入容器管理:

import org.springframework.data.jpa.repository.CrudRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends CrudRepository<User, Long> {

    @Query("SELECT u from User u Where u.username =:username")
    public User getUserByUsername(@Param("username") String username);  
} 

2. 给UserDetailsServiceImpl注入UserRepository

两种常用注入方式,推荐用构造函数注入:

方式一:构造函数注入(推荐)

符合Spring最佳实践,从根源避免空指针:

import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;

public class UserDetailsServiceImpl implements UserDetailsService {

    private final UserRepository userRepository;

    // 通过构造函数注入依赖
    public UserDetailsServiceImpl(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
    
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = userRepository.getUserByUsername(username);
        if(user==null) {
            throw new UsernameNotFoundException("Could not find user");
        }
        return new MyUserDetails(user);
    }
}

方式二:@Autowired字段注入

如果习惯字段注入,直接在userRepository上添加注解:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;

public class UserDetailsServiceImpl implements UserDetailsService {

    @Autowired
    private UserRepository userRepository;
    
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = userRepository.getUserByUsername(username);
        if(user==null) {
            throw new UsernameNotFoundException("Could not find user");
        }
        return new MyUserDetails(user);
    }
}

3. 确保Spring能扫描到组件

检查项目主启动类是否添加了@SpringBootApplication(该注解自带@ComponentScan,会自动扫描主类所在包及其子包)。如果UserRepository或UserDetailsServiceImpl不在主类的子包下,需要手动添加@ComponentScan指定扫描路径。

额外验证点

  • 确认已引入Spring Data JPA依赖(Maven项目检查pom.xml是否包含spring-boot-starter-data-jpa)
  • 数据库连接配置正确,能正常访问数据库

内容的提问来源于stack exchange,提问作者Sanath prabhu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 01:24:12