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

检查数据库用户名是否存在时出现Null Pointer Exception的原因

排查注册接口检查用户存在时的空指针异常

问题场景

调用注册接口时,在执行uDao.existsById(userName)检查用户名是否已存在的步骤中触发了NullPointerException。

核心原因及解决办法

1. uDao 未被Spring容器注入

如果uDao没有添加@Autowired或@Resource注解,Spring不会为其创建实例,此时uDao为null,调用方法必然抛出空指针。

  • 修正方式:在uDao字段上添加注入注解
    @Autowired
    private UserDao uDao; // 确保DAO实例被正确注入
    

2. userName 为空值

虽然代码中打印了userName,但如果请求体里的username字段是空的,userName就会是null。部分DAO实现处理existsById(null)时会触发空指针。

  • 修正方式:先校验用户名非空,再执行存在性检查
    String userName = requestData.getUsername();
    if (userName == null || userName.trim().isEmpty()) {
        throw new IllegalArgumentException("用户名不能为空");
    }
    // 后续检查逻辑
    

3. 代码中其他潜在问题

  • 角色判断逻辑错误:原代码用||(逻辑或)会导致所有角色都触发权限异常,应该改成&&(逻辑与):
    if (!userRole.equalsIgnoreCase("productmaster") && !userRole.equalsIgnoreCase("admin") && !userRole.equalsIgnoreCase("retailer")) {
        throw new InvalidUserRoleException("您无权添加用户");
    }
    
  • 对象创建语法错误:UserDetails构造调用多了一个闭合括号,修正后:
    UserDetails user = new UserDetails(requestData.getUsername(), requestData.getPassword(), requestData.getUserRole());
    
  • 赋值操作误作判断:newuser = uservice.add(user)是赋值而非比较,直接判断返回值即可:
    if (uservice.add(user)) {
        return "用户添加成功";
    }
    

修正后的完整代码

@ResponseStatus(HttpStatus.CREATED)
@PostMapping("/register")
public String registerUser(HttpServletRequest request, @RequestBody UserDetails requestData) {
    String userName = requestData.getUsername();
    // 校验用户名非空
    if (userName == null || userName.trim().isEmpty()) {
        throw new IllegalArgumentException("用户名不能为空");
    }

    System.out.println("checking user");
    System.out.println(userName);
    
    // 检查用户是否已存在
    if (uDao.existsById(userName)) {
        throw new UserAlreadyExistException("您已注册,请直接登录");
    }

    String userRole = (String) request.getSession().getAttribute("role");
    // 修正角色判断逻辑
    if (!userRole.equalsIgnoreCase("productmaster") && !userRole.equalsIgnoreCase("admin") && !userRole.equalsIgnoreCase("retailer")) {
        throw new InvalidUserRoleException("您无权添加用户");
    }

    UserDetails user = new UserDetails(requestData.getUsername(), requestData.getPassword(), requestData.getUserRole());
    if (uservice.add(user)) {
        return "用户添加成功";
    }
    return "用户添加失败";
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 05:35:50