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
相关产品推荐
相关产品推荐

