У меня есть приложение 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)
Я проверил, что файл находится в пути ..
что не так в моем коде? Помогите пожалуйста, спасибо.
Учитывая, что ошибка возникает при попытке прочитать файл, код, который вы разместили прямо сейчас, менее актуален. Пожалуйста, поделитесь кодом, который вы используете для чтения файла, и добавьте его к своему вопросу.
@Cooshal с этим путем возвращает ту же ошибку: java.io.FileNotFoundException: classpath:templates/mailTemplate.html (Нет такого файла или каталога)
@ g00glen00b уже сделано, спасибо!
Что такое точное местоположение этого файла? Это src/main/resources/templates
?
@Cooshal Я не думаю, что проблема будет в этом коде, потому что, когда я делаю это локально, он работает нормально (в среде разработки), но когда я запускаю предварительную среду, я получаю эту ошибку. У меня есть 2 среды dev (на моем компьютере) и pre, где я использую для развертывания файла jar на сервере aws.
@ М.Дейнум, да, это правильно.
Тогда это не сработает. Используйте classpath:templates/mailTemplate.html
и вместо String
используйте Resource
в качестве типа. Затем используйте new BufferedReader(new InputStreamReader(templaceLocation.getInputStream());
вместо чтения файла. Чтение файла не работает в JAR, поскольку он должен указывать на ресурс файловой системы. Это только в случае с распакованным JAR (или в dev, где у вас вообще нет jar).
Вы не можете прочитать 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, мне это нравится!
может быть, попробуйте classpath:templates/mailTemplate.html