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

时间:2016-05-12 21:55:06

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

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

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

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

我使用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

1 个答案:

答案 0 :(得分:2)

您展示src -> main ->等,但这对运行时来说并不重要。

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

在这里分享这个结构。

使用Spring Java&注释配置您不必担心ClassPathResource对象。只需在相应的@Configuration

中声明它就好了
@Value("com/my/package/name/privateKey.txt")
private Resource privateKey;