检查数据库用户名是否存在时出现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
相关产品推荐
相关产品推荐

