【问题标题】:Spring ClassPathResource - cannot be opened because it does not existSpring ClassPathResource - 无法打开,因为它不存在
【发布时间】:2016-09-08 22:44:52
【问题描述】:

更新:我仍然会将 Artem Bilan 的答案标记为正确,但我仍然觉得我需要为任何未来的读者指出这一点。看来我误解了 @Value 注释的“默认值”的概念。我希望通过使用实现的功能

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

如果 application.properties 中定义的文件路径 someProp 抛出异常(即找不到文件),它将尝试使用 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

编辑: WAR 结构:

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

【问题讨论】:

  • 您是否尝试将“privateKey.txt”移动到“资源”目录下? resources -> com -> my -> package -> name -> privateKey.txt
  • 1.请检查您的最终 war/jar 文件是否在类路径中包含“privateKey.txt”。 2 可以使用@Value("classpath:privateKey.txt") Resource privateKey构造。

标签: java spring spring-boot spring-integration spring-integration-sftp


【解决方案1】:

您显示 src -> main -> 等,但这对于运行时无关紧要。

如果您确实要在最终应用程序中包含该文件(jar?war?),请确保将该文件真正打包为最终应用程序的一部分。

并在此处分享该结构。

使用 Spring Java 和注释配置,您无需担心 ClassPathResource 对象。在适当的@Configuration 中声明它就足够了:

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

【讨论】:

  • 我更新了我的问题以显示 WAR 结构。似乎即使在我将 privateKey.txt 放在我的类路径(com/my/package/name/privateKey.txt)中之后,它最终还是被放在了 WAR 的类文件夹中。知道我将如何引用该路径吗?
  • @Value("WEB-INF/classes/com/my/package/name/privateKey.txt") ?
  • 嗯,它最终与@Value("WEB-INF/classes/privateKey.txt") 合作,但这仅适用于云环境。当我在本地工作时,有没有办法也可以相对定义这个键的路径?无论我尝试输入什么路径 @Value() ,我都会得到一个 java.io.FileNotFoundException: Could not open ServletContext resource [resource]
  • 试试这个@Value("${my.local.path.to.privateKey:WEB-INF/classes/privateKey.txt}"),其中my.local.path.to.privateKey你可以指定任何可能的外部方式,例如作为-D Java 选项。
  • 抱歉,对 Spring 来说还是个新手,所以请确保我理解正确。每当我使用 @Value${} 语法时,它都会搜索我在 application.properties 文件中定义的属性。我去创建了一个名为 privateKeyPath=local.path.to.privateKey 的属性并尝试了你写的内容,但我仍然得到java.io.FileNotFoundException: Could not open ServletContext resource [resource]。如果一切都失败了,我想我可以回到使用从C: 开始的FileSystemResource 的绝对系统文件路径。
猜你喜欢
  • 2011-04-23
  • 2019-07-12
  • 2021-12-14
  • 2015-11-30
  • 1970-01-01
  • 1970-01-01
  • 2017-02-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多