SpringBoot执行CommandLineRunner失败,无法读取JSON文件该如何修复?
问题根因
报错的核心原因是资源文件读取逻辑错误:
你调用TypeReference.class.getResourceAsStream("json/countrylist.json")时,不带前缀/的路径默认会从TypeReference类本身的包目录下查找资源,而非你的项目类路径根目录(也就是你放置文件的resources目录),因此返回null,后续传给ObjectMapper时触发空参数异常。
修复方案
方案1:直接修改路径规则
在路径前加/,指定从类路径根目录开始查找:
InputStream inputStream = TypeReference.class.getResourceAsStream("/json/countrylist.json");
方案2:用自定义类的类加载器读取(兼容性更好)
使用你自己编写的配置类的类加载器读取资源,不受第三方类路径规则影响:
InputStream inputStream = StudentConfigaration.class.getClassLoader().getResourceAsStream("json/countrylist.json");
注意类加载器的getResourceAsStream方法默认从类路径根目录查找,不需要加开头的/。
方案3:使用Spring原生资源工具(Spring项目推荐)
用Spring提供的ClassPathResource读取资源,适配Spring Boot的打包、类加载器规则,避免环境差异问题:
// 顶部导入org.springframework.core.io.ClassPathResource InputStream inputStream = new ClassPathResource("json/countrylist.json").getInputStream();
可选检查项
如果修改后仍然读取失败,可排查以下两点:
- 确认resources目录下的文件结构正确,确实存在
json/countrylist.json文件,路径、文件名没有拼写错误 - 确认你的构建工具(Maven/Gradle)没有配置排除json文件的资源过滤规则,确保json文件会被正常打包到classes目录下
内容的提问来源于stack exchange,提问作者ravindu
相关产品推荐
相关产品推荐

