Spring ClassPathResource - 无法打开,因为它不存在

Spring ClassPathResource - cannot be opened because it does not exist

更新: 我仍然会将 Artem Bilan 的答案标记为正确,但我仍然觉得我需要为未来的读者指出这一点。看来我误解了 @Value 注释的 'default value' 的概念。我希望通过使用

实现的功能
@Value("${someProp:defaultFilePath}")
private Resource resourcefilePath;

如果 application.properties 中定义的文件路径 someProp 抛出异常(即找不到文件),它将尝试使用 defaultFilePath(即上面的那个)。定义默认值的实际作用是,如果 属性 本身 (someProp) 在 application.properties 文件中不存在(未定义或注释掉),它会尝试使用默认值。


我正在使用 Spring 集成 Sftp 进行 SSH 文件传输。使用 Spring 启动所以没有 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

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

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

并在此处分享该结构。

使用 Spring Java 和注释配置,您无需担心 ClassPathResource 对象。在适当的 @Configuration:

中这样声明就足够了
@Value("com/my/package/name/privateKey.txt")
private Resource privateKey;