java - 如何在 Spring Boot 中从资源中读取 JSON 文件
问题描述
使用 Spring Boot 2.1.5 Release,创建了以下示例 Spring Boot 微服务:
Maven项目结构:
MicroService
│
pom.xml
src
│
└───main
│
├───java
│ │
│ └───com
│ └───microservice
│ │
│ └───MicroServiceApplication.java
│
└───resources
│
└───data.json
│
application.properties
具有以下 JSON 文件(在 src/main/resources/data.json 内):
{"firstName": "John", "lastName": "Doe"}
微服务应用:
@SpringBootApplication
public class MicroServiceApplication {
@Bean
CommandLineRunner runner() {
return args -> {
String data = FilePathUtils.readFileToString("../src/main/resources/data.json", MicroServiceApplication.class);
System.out.println(data);
};
}
public static void main(String[] args) {
SpringApplication.run(MicroServiceApplication.class, args);
}
}
引发以下异常:
java.lang.IllegalStateException: Failed to execute CommandLineRunner
...
Caused by: java.io.IOException: Stream is null
FilePathUtils.java:
import io.micrometer.core.instrument.util.IOUtils;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
public class FilePathUtils {
public static String readFileToString(String path, Class aClazz) throws IOException {
try (InputStream stream = aClazz.getClassLoader().getResourceAsStream(path)) {
if (stream == null) {
throw new IOException("Stream is null");
}
return IOUtils.toString(stream, Charset.defaultCharset());
}
}
}
我可能做错了什么?
解决方案
虽然@Deadpool 提供了答案,但我想补充一点,当创建 spring boot 工件时src/main/
,不再有这样的文件夹(您可以打开 spring boot 工件并自行确保)。
所以你不能像这样加载资源:
FilePathUtils.readFileToString("../src/main/resources/data.json", MicroServiceApplication.class);
Spring确实有一个Resource
可以在应用程序中使用的抽象,甚至可以注入到类/配置中:
@Value("classpath:data/data.json")
Resource resourceFile;
请注意前缀“类路径”,它意味着资源将从类路径中解析(读取正确打包到工件中的所有内容)。
有一个很好的教程,可以很方便
推荐阅读
- uwp - RichEditBox TextChangedEvent 在 UWP 中无限触发?
- c# - 将基于属性名称和值的过滤器表达式转换为 Linq Where 子句 Func
? - reactjs - 通过高阶组件的反应搜索过滤器(钩子)不起作用
- java - Firebase 实时数据库 - 检索数据 Android Studio
- azure - 当另一个流水线在另一个数据工厂上完成时运行流水线
- hadoop - 决定为 Hadoop map reduce 程序中最快处理指定的最佳 reducer 数量
- node.js - sequelize-hierarchy 未找到
- python - 尝试通过计数多字段 Django 对标签进行排序
- python - 用于文本分类的词嵌入
- reactjs - 停止挂载/卸载,通过防止卸载来保持组件存活