使用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"}
MicroServiceApplication:
@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的工件并自己确认)。
src/main/
因此,您 无法 像这样加载资源:
FilePathUtils.readFileToString("../src/main/resources/data.json", MicroServiceApplication.class);
Spring确实有一个称为的抽象Resource,可以在应用程序中使用,甚至可以注入到类/配置中:
Resource
@Value("classpath:data/data.json") Resource resourceFile;
注意前缀“ classpath”,这意味着将从类路径解析资源(读取正确打包到工件中的所有内容)。