Как установить местоположение файла в свойствах приложения — Spring boot

У меня есть приложение Spring Boot, код должен получить доступ к файлу в папке ресурсов/шаблонов. вот мой файл application.properties:

    pont.email.template.location=templates/mailTemplate.html

Это файл Java, в котором я использую переменную:

    @Value("${pont.email.template.location}") 
    private String templateLocation;
    ----------------
    BufferedReader reader = new BufferedReader(new FileReader(templateLocation));

Проблема не в том, что варибале не получается, возвращается корректно. Проблема в том, что приложение не нашло ни одного файла по этому пути.

я всегда получаю

    java.io.FileNotFoundException: templates/mailTemplate.html (No such file or directory)

Я проверил, что файл находится в пути ..

что не так в моем коде? Помогите пожалуйста, спасибо.

может быть, попробуйте classpath:templates/mailTemplate.html

cooshal 08.04.2019 13:07

Учитывая, что ошибка возникает при попытке прочитать файл, код, который вы разместили прямо сейчас, менее актуален. Пожалуйста, поделитесь кодом, который вы используете для чтения файла, и добавьте его к своему вопросу.

g00glen00b 08.04.2019 13:12

@Cooshal с этим путем возвращает ту же ошибку: java.io.FileNotFoundException: classpath:templates/mailTemplate.html (Нет такого файла или каталога)

María Cristina Fernández López 08.04.2019 13:13

@ g00glen00b уже сделано, спасибо!

María Cristina Fernández López 08.04.2019 13:15

Что такое точное местоположение этого файла? Это src/main/resources/templates?

M. Deinum 08.04.2019 13:17

@Cooshal Я не думаю, что проблема будет в этом коде, потому что, когда я делаю это локально, он работает нормально (в среде разработки), но когда я запускаю предварительную среду, я получаю эту ошибку. У меня есть 2 среды dev (на моем компьютере) и pre, где я использую для развертывания файла jar на сервере aws.

María Cristina Fernández López 08.04.2019 13:19

@ М.Дейнум, да, это правильно.

María Cristina Fernández López 08.04.2019 13:20

Тогда это не сработает. Используйте classpath:templates/mailTemplate.html и вместо String используйте Resource в качестве типа. Затем используйте new BufferedReader(new InputStreamReader(templaceLocation.getInputStream()); вместо чтения файла. Чтение файла не работает в JAR, поскольку он должен указывать на ресурс файловой системы. Это только в случае с распакованным JAR (или в dev, где у вас вообще нет jar).

M. Deinum 08.04.2019 13:36
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
3
8
19 121
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы не можете прочитать File внутри JAR. Это не удается из-за того, что File должен указывать на фактический файловый ресурс в файловой системе, а не на что-то внутри JAR.

Позвольте Spring сделать тяжелую работу и использовать абстракцию Resource, чтобы скрыть неприятные внутренности. Поэтому вместо использования String используйте Resource и добавьте к значению свойства префикс classpath:, чтобы убедиться, что оно загружено из пути к классам. Затем используйте InputStreamReader вместо FileReader, чтобы получить необходимую информацию.

@Value("${pont.email.template.location}") 
private Resource templateLocation;
----------------
BufferedReader reader = new BufferedReader(new InputStreamReader(templateLocation.getInputStream()));

В вашем application.properties префикс с classpath:.

pont.email.template.location=classpath:templates/mailTemplate.html

Теперь он должен работать независимо от среды, в которой вы работаете.

Большое спасибо! @M.Deinum M.Deinum, мне это нравится!

María Cristina Fernández López 08.04.2019 13:57

Другие вопросы по теме