SpringBoot读取JSON存入MS SQL报错:argument 'src' is null
问题分析与解决方案
问题描述
我想要从JSON文件读取数据并存入MS SQL数据库,以下是我的Covid19Application.java类代码,错误出现在for循环前的代码行:
@SpringBootApplication public class Covid19Application { public static void main(String[] args) { SpringApplication.run(Covid19Application.class, args); } @Bean CommandLineRunner runner(SaveDataFromJsonToDBService saveDataFromJsonToDBService) { return args -> { ObjectMapper mapper = new ObjectMapper(); TypeReference<List<CovidStatistics>> typeReference = new TypeReference<List<CovidStatistics>>(){}; InputStream inputStream = TypeReference.class.getResourceAsStream("/CovidStatistics.json"); try { List<CovidStatistics> covidStatistics = mapper.readValue(inputStream,typeReference); for (CovidStatistics cs : covidStatistics) { saveDataFromJsonToDBService.save(cs); } //saveDataFromJsonToDBService.save(covidStatistics); System.out.println("Users Saved!"); } catch (IOException e){ System.out.println("Unable to save users: " + e.getMessage()); } }; } }
报错信息(中文翻译)
java.lang.IllegalStateException: 执行CommandLineRunner失败 at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:774) ~[spring-boot-2.7.4.jar:2.7.4] at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:755) ~[spring-boot-2.7.4.jar:2.7.4] at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) ~[spring-boot-2.7.4.jar:2.7.4] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306) ~[spring-boot-2.7.4.jar:2.7.4] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1295) ~[spring-boot-2.7.4.jar:2.7.4] at com.example.Covid19.Covid19Application.main(Covid19Application.java:18) ~[classes/:na] Caused by: java.lang.IllegalArgumentException: 参数“src”为null at com.fasterxml.jackson.databind.ObjectMapper._assertNotNull(ObjectMapper.java:4737) ~[jackson-databind-2.11.4.jar:2.11.4] at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3512) ~[jackson-databind-2.11.4.jar:2.11.4] at com.example.Covid19.Covid19Application.lambda$runner$0(Covid19Application.java:28) ~[classes/:na] at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:771) ~[spring-boot-2.7.4.jar:2.7.4] ... 5个通用栈帧省略 2022-10-06 20:42:51.780 INFO 30652 --- [ main] j.LocalContainerEntityManagerFactoryBean : 关闭持久化单元'default'的JPA EntityManagerFactory 2022-10-06 20:42:51.782 INFO 30652 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - 开始关闭... 2022-10-06 20:42:51.788 INFO 30652 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - 关闭完成。 进程以退出代码1结束
核心原因
报错的根源是TypeReference.class.getResourceAsStream("/CovidStatistics.json")返回了null,导致Jackson的readValue方法接收到null的输入流,触发了参数非空校验的异常。
解决方案
1. 修正资源文件获取方式
不要使用TypeReference的类加载器来读取资源,改用当前应用类的类加载器,确保正确找到resources目录下的文件:
// 替换原来的输入流获取代码 InputStream inputStream = Covid19Application.class.getResourceAsStream("/CovidStatistics.json");
2. 规范的Spring资源加载方式(推荐)
使用Spring提供的ResourceLoader加载资源,更符合Spring Boot规范,稳定性更高:
@Bean CommandLineRunner runner(SaveDataFromJsonToDBService saveDataFromJsonToDBService, ResourceLoader resourceLoader) { return args -> { ObjectMapper mapper = new ObjectMapper(); TypeReference<List<CovidStatistics>> typeReference = new TypeReference<List<CovidStatistics>>(){}; // 加载classpath下的JSON文件 Resource resource = resourceLoader.getResource("classpath:CovidStatistics.json"); InputStream inputStream = resource.getInputStream(); try { List<CovidStatistics> covidStatistics = mapper.readValue(inputStream, typeReference); covidStatistics.forEach(saveDataFromJsonToDBService::save); System.out.println("数据已保存!"); } catch (IOException e){ System.out.println("保存失败: " + e.getMessage()); } finally { // 关闭输入流,避免资源泄漏 if (inputStream != null) { inputStream.close(); } } }; }
3. 必要检查项
- 确认
CovidStatistics.json文件放在src/main/resources目录下(Spring Boot默认资源目录) - 文件名需完全匹配(大小写敏感,Linux/macOS环境下需特别注意)
- 检查JSON文件格式是否合法,避免后续解析出现其他错误
内容的提问来源于stack exchange,提问作者Robincho Bibanka
相关产品推荐
相关产品推荐

