Java 11多条件登录校验切换异常问题排查
多角色登录空指针问题排查与修复
问题根源
从你的代码和现象来看,空指针(NullPointerException)的触发原因大概率是这两个:
- DAO对象未正确注入:
pracownikDao或者osobaKontaktowaDao实例为null,当执行到else if分支调用其方法时直接触发空指针。这也解释了为什么逻辑没进入后续分支——还没执行到方法内部就报错了。 - Hibernate查询方法不统一:
isContactPersonExist用了uniqueResult(),另外两个方法用getSingleResult(),虽然select count(*)理论上必然返回数值,但如果Worker/ContactPerson的实体映射有问题,或者会话异常,可能导致返回null进而触发空指针。 - 还有个小笔误:
handleLogin里第一个分支的lonInByUser应该是logInByUser,不过你说用户登录正常,估计是粘贴代码时手滑了。
修复步骤
1. 检查DAO注入有效性
先确认pracownikDao和osobaKontaktowaDao已通过依赖注入框架正确初始化:
- DAO类上需标注
@Repository或对应注入注解 - 存放
handleLogin的类中,这两个DAO字段要加@Autowired或对应的注入注解 - 启动项目时查看日志,排查是否有注入失败的报错
2. 统一查询方法并添加兜底判断
所有isXXXExist方法统一使用getSingleResult()(因为select count(*)必然返回Long类型数值,不会抛出无结果异常),同时增加空值兜底判断规避极端情况:
public Long isWorkerExist(RequestLoginDefault request) { Session session = sessionFactory.getCurrentSession(); Long count = (Long) session.createQuery("select count(*) from Worker where email = :email and password = :password") .setParameter("email", request.getEmail()) .setParameter("password", request.getPassword()) .getSingleResult(); return count == null ? 0L : count; } public Long isContactPersonExist(RequestLoginDefault request) { Session session = sessionFactory.getCurrentSession(); Long count = (Long) session.createQuery("select count(*) from ContactPerson where email = :email and password = :password") .setParameter("email", request.getEmail()) .setParameter("password", request.getPassword()) .getSingleResult(); return count == null ? 0L : count; }
3. 修复拼写错误
把handleLogin中的lonInByUser修正为logInByUser,避免后续扩展时出现问题。
4. 添加异常捕获(可选但实用)
在handleLogin中增加异常捕获逻辑,返回更友好的错误信息,同时避免直接抛出空指针到前端:
public Object handleLogin(@RequestBody RequestLoginDefault request) { try { if (uzytkownikDao.isUserExist(request) > 0) { return logInByUser(request); } // 先判断DAO是否为null,提前规避空指针 else if (pracownikDao != null && pracownikDao.isWorkerExist(request) > 0) { return logInByWorker(request); } else if (osobaKontaktowaDao != null && osobaKontaktowaDao.isContactPersonExist(request) > 0) { return logInByPerson(request); } else { return "账号或密码错误"; } } catch (Exception e) { return "登录失败:系统内部错误"; } }
内容的提问来源于stack exchange,提问作者treumiton
相关产品推荐
相关产品推荐

