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

Java 11多条件登录校验切换异常问题排查

多角色登录空指针问题排查与修复

问题根源

从你的代码和现象来看,空指针(NullPointerException)的触发原因大概率是这两个:

  1. DAO对象未正确注入:pracownikDao或者osobaKontaktowaDao实例为null,当执行到else if分支调用其方法时直接触发空指针。这也解释了为什么逻辑没进入后续分支——还没执行到方法内部就报错了。
  2. Hibernate查询方法不统一:isContactPersonExist用了uniqueResult(),另外两个方法用getSingleResult(),虽然select count(*)理论上必然返回数值,但如果Worker/ContactPerson的实体映射有问题,或者会话异常,可能导致返回null进而触发空指针。
  3. 还有个小笔误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 04:03:12