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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 14:25:25