Spring调用接口时Repository为null抛出空指针异常问题
问题描述
运行Spring项目时持续抛出空指针异常,调用getAll查询接口时也会触发相同错误,报错信息如下:
java.lang.NullPointerException: Cannot invoke "com.example.cinema.Repository.VideosRepository.save(Object)" because "com.example.cinema.Service.VideoService.videoRepository" is null
问题根因
核心错误出在业务层的配置上:
VideoService中的videoRepository字段被加了static修饰符,Spring依赖注入不支持直接给静态字段注入Bean,因此videoRepository始终为null,调用其方法时必然触发空指针VideoService中的create方法被错误添加static修饰,和Spring Bean的实例化逻辑冲突- Controller层额外注入了
VideosRepository但全程未使用,属于冗余配置
修复方案
1. 修正Service层代码
去掉字段和方法上多余的static修饰符,修正后代码如下:
@Service public class VideoService { @Autowired private VideosRepository videoRepository; public List<Videos> getAll(){ return videoRepository.findAll(); } public Videos create(Videos videos) { return videoRepository.save(videos); } }
2. 清理Controller层冗余代码
删掉未使用的videoRepository注入即可,修正后Controller代码:
@RestController public class VideosController { @Autowired private VideoService videoService; @RequestMapping("/videos/getAll") public List<Videos> getAll(){ System.out.println("called"); return videoService.getAll(); } @PostMapping("/videos/create") @ResponseBody public String create(@RequestBody Videos videos) { System.out.println(videos.getTitle()); videoService.create(videos); return "Thanks For Posting!!!"; } }
3. Repository层无需修改
当前Repository层写法符合Spring Data MongoDB规范,保持原有代码即可:
@Repository public interface VideosRepository extends MongoRepository<Videos, String> { List<Videos> findByTitle(String title); }
补充说明
- Spring依赖注入是基于实例对象的,静态字段属于类级别,不归Spring容器管理,普通业务场景禁止直接用
@Autowired注入静态属性 - 修复完成后重启项目,接口即可正常访问
内容的提问来源于stack exchange,提问作者htmlhelp32
相关产品推荐
相关产品推荐

