如何从 Spring Boot 中的资源中读取 JSON 文件

新手上路,请多包涵

使用 Spring 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

文件路径工具.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());
        }
    }
}

我可能做错了什么?

原文由 PacificNW_Lover 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

虽然@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;

请注意前缀“类路径”,这意味着资源将从类路径中解析(读取正确打包到工件中的所有内容)。

有一个很好的 教程,可以派上用场

原文由 Mark Bramnik 发布,翻译遵循 CC BY-SA 4.0 许可协议

在spring boot项目中你可以使用 ResourceUtils

 Path file = ResourceUtils.getFile("data/data.json").toPath();

ClassPathResource

 String clsPath =  new ClassPathResource("data/data.json").getPath();

Sometimes if you are reading different extension file like .graphql or .mmdb or .json you need to read it as InputStream using spring ResourceLoader ,这篇 文章 有明确的解释

@Autowire
private ResourceLoader resourceLoader;

   Resource resource =resourceLoader.getResource("classpath:GeoLite2-Country.mmdb");
   InputStream dbAsStream = resource.getInputStream();

并使用 --- 将 InputStream 复制到临时文件 Files.copy

 Files.copy(inputStream, outputFile.toPath(), StandardCopyOption.REPLACE_EXISTING);

原文由 Deadpool 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题