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

标签 java spring-boot spring-micrometer

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

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 的抽象,可以在应用程序中使用,甚至可以注入(inject)到类/配置中:

@Value("classpath:data/data.json")
Resource resourceFile;

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

有个不错的Tutorial这可以派上用场

关于java - 如何从 Spring Boot 中的资源中读取 JSON 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58703834/

相关文章:

java - 将 byte[] 转换为 AES key

java - 在 Spring-Boot 中处理并发事务

java - Spring Security上下文中的身份验证和授权有什么区别?

micrometer - 如何使用不同的标签为多个指标名称使用相同的 Counter 对象

spring-boot - 在 spring-boot 中为 http.server.requests 配置分布统计

java - 方法内类加载器的上下文

java - 来自 url 的文本,但它被复制了 3 到 4 次

java - 有没有办法确定 Connection 是托管的?

spring-boot - Spring Boot @IntegrationTest 注解用于测试

spring-boot - 微米跟踪不包括日志中的跟踪 ID