Прочитать файл из папки ресурсов в Spring Boot

Я использую Spring Boot и json-schema-validator. Я пытаюсь прочитать файл jsonschema.json из папки resources. Я пробовал несколько разных способов, но я не могу заставить его работать. Это мой код.

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.

Спасибо за хорошо написанную страницу Локеша Гупты: Блог

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);

Также см. Это:

PS может возникнуть проблема, если проект был скомпилирован на одном компьютере и после этого был запущен на другом компьютере или вы запустили приложение в Docker. В этом случае пути к папке ресурса могут быть недействительными. В этом случае было бы лучше определить пути к вашим ресурсам во время выполнения:

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

Ответ 3

если у вас есть, например, папка config в папке Resources, я попробовал этот класс, работающий отлично, надеюсь, будет полезным

File file = ResourceUtils.getFile("classpath:config/sample.txt")

//Read File Content
String content = new String(Files.readAllBytes(file.toPath()));
System.out.println(content);

Ответ 4

создайте папку json в ресурсах в качестве подпапки, затем добавьте json файл в папку, затем вы можете использовать этот код: enter image description here

import com.fasterxml.jackson.core.type.TypeReference;

InputStream is = TypeReference.class.getResourceAsStream("/json/fcmgoogletoken.json");

это работает в Докере.

Ответ 5

Вот мое решение. Может помочь кому-то;

Он возвращает InputStream, но я предполагаю, что вы тоже можете читать с него.

InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("jsonschema.json");

Ответ 6

застрял в той же проблеме, это помогает мне

URL resource = getClass().getClassLoader().getResource("jsonschema.json");
JsonNode jsonNode = JsonLoader.fromURL(resource);

Ответ 7

Смотрите мой ответ здесь: fooobar.com/info/16997728/...

import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;

Используйте эти 2 импорта.

декларировать

@Autowired
ResourceLoader resourceLoader;

Используйте это в какой-то функции

Resource resource=resourceLoader.getResource("classpath:preferences.json");

В вашем случае, если вам нужен файл, вы можете использовать следующие

File file = resource.getFile()

Ссылка: http://frugalisminds.com/spring/load-file-classpath-spring-boot/ Как уже упоминалось в предыдущих ответах, не используйте ResourceUtils, он не работает после развертывания JAR, это также будет работать в IDE как после развертывания