春季:加载前检查类路径资源是否存在

时间:2018-12-26 10:52:47

标签: java spring spring-boot

我有一个代码,需要检查是否存在类路径资源并执行一些操作。

File file = ResourceUtils.getFile("classpath:my-file.json");
if (file.exists()) {
    // do one thing
} else {
    // do something else
}

问题::如果资源不存在,ResourceUtils.getFile()会抛出FileNotFoundException。同时,我不想在代码流中使用异常,我想检查资源是否存在。

问题:是否可以使用Spring的API检查资源是否存在?

为什么需要使用Spring完成此操作:因为没有Spring,我需要自己选择一个正确的类加载器,这不方便。我需要使用其他代码才能使其在单元测试中起作用。

3 个答案:

答案 0 :(得分:1)

您可以使用ResourceLoader Interface来加载getResource(),然后使用Resource.exists()来检查文件是否存在。

@Autowired
ResourceLoader resourceLoader;  

Resource resource = resourceLoader.getResource("classpath:my-file.json");
if (resource.exists()) {
  // do one thing
} else {
  // do something else
}

答案 1 :(得分:0)

您可以使用Class.getResource方法

  

查找具有给定名称的资源。

它不会引发异常,但是如果找不到资源,则返回null

 URL resource = clazz.getResource("my-file.json");

答案 2 :(得分:0)

它已经得到了回答并且很老,但想到有人看到docker和maven不能使用相同的解决方案,即使resource.exists()返回true。在这种情况下,我们可以做这样的事情(虽然有点 hacky):

            Resource resource = resourceLoader.getResource("classpath:path/to/file");
            if (resource.exists()) {
                try {
                    // below throws file not found if the app runs in docker
                    resource.getFile()
                } catch (FileNotFoundException e) {
                    // docker uses this
                    InputStream stream = new ClassPathResource("classpath:path/to/file").getInputStream();                        
                }
            }