使用Sping Boot 2.1.5发行版,创建了以下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());
}
}
}
我到底做错了什么?
3条答案
按热度按时间lvmkulzt1#
虽然@Deadpool已经提供了答案,但我想补充的是,当创建spring Boot 的工件时,不再存在这样的
src/main/
文件夹(您可以打开spring boot工件并自行确定)。因此,您不能像这样加载资源:
Spring确实有一个名为
Resource
的抽象,它可以在应用程序中使用,甚至可以注入到类/配置中:注意前缀“classpath”,它意味着资源将从类路径解析(读取正确打包到工件中的所有内容)。
有一个相当不错的Tutorial可以方便使用
ryevplcw2#
在spring Boot 项目中,可以使用
ResourceUtils
或
ClassPathResource
有时如果你正在阅读不同的扩展名文件,如
.graphql
或.mmdb
或.json
,你需要使用springResourceLoader
将其读取为InputStream
,此article有明确的解释然后使用
Files.copy
将InputStream
复制到临时文件lyr7nygr3#
您可以使用
jackson-databind
库。Jackson
ObjectMapper
类(com.fasterxml.jackson.databind.ObjectMapper
)是解析JSON
最简单的方法之一。Jackson ObjectMapper将can parse JSON
从字符串、流或文件以及create a Java object or object graph
表示的JSON解析为Java对象。Parsing JSON
也称为deserialize Java objects
from JSON。并且您的
.pom
文件中应该包含jackson-databind
: