从 Spring Boot 中的资源文件夹中读取文件

我正在使用Spring Boot和.我正在尝试读取从该文件夹调用的文件。我已经尝试了几种不同的方法,但我无法让它工作。这是我的代码。json-schema-validatorjsonschema.jsonresources

ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource("jsonschema.json").getFile());
JsonNode mySchema = JsonLoader.fromFile(file);

这是文件的位置。

enter image description here

在这里,我可以看到文件夹中的文件。classes

enter image description here

但是当我运行代码时,我得到以下错误。

jsonSchemaValidator error: java.io.FileNotFoundException: /home/user/Dev/Java/Java%20Programs/SystemRoutines/target/classes/jsonschema.json (No such file or directory)

我在代码中做错了什么?


答案 1

在花费大量时间尝试解决此问题后,终于找到了有效的解决方案。该解决方案利用了Spring的ResourceUtils。也应该适用于 json 文件。

感谢您Lokesh Gupta精心撰写的页面:博客

enter image description here

package utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.ResourceUtils;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.io.File;


public class Utils {

    private static final Logger LOGGER = LoggerFactory.getLogger(Utils.class.getName());

    public static Properties fetchProperties(){
        Properties properties = new Properties();
        try {
            File file = ResourceUtils.getFile("classpath:application.properties");
            InputStream in = new FileInputStream(file);
            properties.load(in);
        } catch (IOException e) {
            LOGGER.error(e.getMessage());
        }
        return properties;
    }
}

要回答评论中的一些问题:

非常确定我在Amazon EC2上运行了这个,使用java -jar target/image-service-slave-1.0-SNAPSHOT.jar

看看我的github存储库:https://github.com/johnsanthosh/image-service 找出从JAR运行它的正确方法。


答案 2

非常简短的回答:您正在类加载器类的范围内查找资源,而不是目标类。这应该有效:

File file = new File(getClass().getResource("jsonschema.json").getFile());
JsonNode mySchema = JsonLoader.fromFile(file);

另外,这可能会有所帮助阅读:

附言:有一种情况是,一个项目在一台机器上编译,然后在另一台机器上或Docker内部启动。在这种情况下,资源文件夹的路径将无效,您需要在运行时获取它:

ClassPathResource res = new ClassPathResource("jsonschema.json");    
File file = new File(res.getPath());
JsonNode mySchema = JsonLoader.fromFile(file);

2020年更新

最重要的是,如果要将资源文件作为 String 读取,例如在测试中,可以使用以下静态 utils 方法:

public static String getResourceFileAsString(String fileName) {
    InputStream is = getResourceFileAsInputStream(fileName);
    if (is != null) {
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        return (String)reader.lines().collect(Collectors.joining(System.lineSeparator()));
    } else {
        throw new RuntimeException("resource not found");
    }
}

public static InputStream getResourceFileAsInputStream(String fileName) {
    ClassLoader classLoader = {CurrentClass}.class.getClassLoader();
    return classLoader.getResourceAsStream(fileName);
}

用法示例:

String soapXML = getResourceFileAsString("some_folder_in_resources/SOPA_request.xml");

推荐