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

Spring Boot使用Stream分页时出现java.lang.NullPointerException问题

空指针异常排查方案

根据堆栈信息,空指针明确发生在JobOfferController.java:54,结合你的代码实现,核心排查点如下:

1. Spring依赖未正确注入

Controller中的jobOfferRepository或jobOfferService大概率未被Spring容器实例化,导致调用方法时触发空指针:

  • 检查jobOfferRepository接口是否添加@Repository注解,且所在包路径在Spring Boot主类的扫描范围内;
  • 检查jobOfferService实现类是否添加@Service注解;
  • 确认Controller中通过构造函数注入或@Autowired注解注入依赖,而非手动实例化。

示例正确注入方式:

@RestController
@RequestMapping("/your-path")
public class JobOfferController {
    private final JobOfferRepository jobOfferRepository;
    private final JobOfferService jobOfferService;

    // 推荐构造函数注入
    public JobOfferController(JobOfferRepository jobOfferRepository, JobOfferService jobOfferService) {
        this.jobOfferRepository = jobOfferRepository;
        this.jobOfferService = jobOfferService;
    }

    // 接口方法...
}

2. 自定义Page类注解错误

你的Page类是分页DTO(数据传输对象),却添加了JPA的@Table(name = "PAGE")注解,这会导致Spring将其识别为数据库实体类,可能在序列化返回结果时引发异常,建议立即移除该注解:

修改后的Page类:

@Data
@NoArgsConstructor
public class Page<T> {

    // 当前页码
    private int pageNumber;

    // 每页显示条数
    private int resultsPerPage;

    // 总记录数
    private int totalResults;

    // 当前页数据列表
    private List<T> items;

    public Page(int pageNumber, int resultsPerPage, int totalResults, List<T> items) {
        this.pageNumber = pageNumber;
        this.resultsPerPage = resultsPerPage;
        this.totalResults = totalResults;
        this.items = items;
    }
}

3. 额外验证点

  • 确认JobOfferEntity是合法JPA实体:添加@Entity、@Id等必要注解,避免findAll()返回异常结果(Spring Data JPA的findAll()默认返回空列表而非null,此概率较低);
  • Keycloak认证排查:虽然堆栈显示Keycloak过滤器,但空指针发生在Controller方法内部,认证失败通常返回401而非空指针,可验证请求是否携带有效Token,排除间接影响。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 12:15:46