Прочитать файл из папки ресурсов в 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);
Это местоположение файла.
И здесь я вижу файл в папке classes
.
Но когда я запускаю код, я получаю следующую ошибку.
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.
Спасибо за хорошо написанную страницу Локеша Гупты: Блог
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 файл в папку, затем вы можете использовать этот код:
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 как после развертывания