1

UPDATE: Я все же буду отмечать ответ Артема Билана как правильный, но я все еще чувствовал, что мне нужно указать на это для будущих читателей. Кажется, я неправильно понял концепцию «значения по умолчанию» для аннотации @Value. Функциональность я надеялся достичь с помощьюSpring ClassPathResource - невозможно открыть, потому что его не существует

@Value("${someProp:defaultFilePath}") 
private Resource resourcefilePath; 

было то, что следует путь к файлу someProp определено в application.properties сгенерирует исключение (т.е. файл не найден), он будет затем пытаться использовать defaultFilePath (т.е. один выше). Фактическое определение значения по умолчанию состоит в том, что если само свойство (someProp) не существует (не определено или не закомментировано) в файле application.properties, оно затем пытается использовать значение по умолчанию.


Я использую Spring Integration Sftp для передачи файлов SSH. Использование Spring Boot, поэтому нет xml-файлов. Перед настройкой объекта DefaultSftpSessionFactory я определяю ресурс, который содержит .txt-файл с закрытым ключом, необходимым для аутентификации sFtp.

Раньше я использовал FileSystemResource вроде этого:

Resource resource = new FileSystemResource("C:/absolute/path/to/my/private/key/privateKey.txt"); 

Это работало просто отлично. Однако это приложение в конечном итоге будет помещено в облачную среду, что означает, что такие абсолютные пути больше не будут работать. Я пытаюсь вместо этого использовать ClassPathResource, но он не работает независимо от того, что я пытаюсь. До сих пор я попытался следующие:

Resource resource = new ClassPathResource("privateKey.txt"); 
Resource resource = new ClassPathResource("privateKey.txt", SomeClassInClassPath.class); 
Resource resource = new ClassPathResource("com/my/package/name/privateKey.txt"); 

Моя структура каталогов выглядит примерно так:

ProjectFolder -> src -> main -> java -> com -> my -> package -> name -> various java classes 
                     privateKey.txt 
          -> resources -> etc... 

Там больше, но это упрощенный вариант. Может кто-нибудь помочь выяснить, как я могу узнать, как он узнает путь к моему .txt? Я продолжаю получать java.io.FileNotFoundException: class path resource [resource] cannot be opened because it does not exist независимо от того, что я пробую.

EDIT: WAR структура:

ProjectFolder -> META-INF -> maven -> etc.. 
       -> org -> springframework -> boot -> etc.. 
       -> WEB-INF -> classes -> com 
            -> public 
            -> application.properties 
            -> privateKey.txt 
+0

Вы пробовали двигая «privateKey.txt» в директории «ресурсы»? 'resources -> com -> my -> package -> name -> privateKey.txt' – dnault

+0

1. Убедитесь, что ваш последний файл войны/jar содержит« privateKey.txt »в пути к классу. 2 Вы можете использовать '@Value (" classpath: privateKey.txt ") ресурс privateKey'. –

ответ

2

Вы показываете src -> main -> и т.д., но это не имеет значения для выполнения.

Если вы действительно собираетесь иметь этот файл в окончательном приложении (jar? War?), Убедитесь, что вы действительно упаковываете этот файл в качестве части окончательного приложения.

И поделитесь этой структурой здесь.

С Spring Java & Аннотация Конфигурация Вам не нужно беспокоиться о объекте ClassPathResource. Существует достаточно просто объявить его как это в соответствующем @Configuration:

@Value("com/my/package/name/privateKey.txt") 
private Resource privateKey; 
+0

Я обновил свой вопрос, чтобы показать структуру WAR. Кажется, что даже после того, как я поместил privateKey.txt в свой путь к классам (com/my/package/name/privateKey.txt), он попадает в папку классов в WAR.Любая идея, как я буду ссылаться на этот путь? – bscott

+0

'@Value (« WEB-INF/classes/com/my/package/name/privateKey.txt »)'? –

+0

Рабочий код в студию! –

Смежные вопросы