Spring 缺少引导访问静态资源 scr/main/resources

Spring Boot access static resources missing scr/main/resources

我正在开发 Spring 启动应用程序。我需要在开始时解析一个 XML 文件 (countries.xml)。问题是我不知道把它放在哪里才能访问它。 我的文件夹结构是

ProjectDirectory/src/main/java
ProjectDirectory/src/main/resources/countries.xml

我的第一个想法是将它放在 src/main/resources 中,但是当我尝试创建文件 (countries.xml) 时,我得到了一个 NPE,堆栈跟踪显示我的文件在 ProjectDirectory (所以 src/main/resources/ 未添加)。我尝试创建文件 (resources/countries.xml) 并且路径看起来像 ProjectDirectory/resources/countries.xml (所以再次 src/main 未添加)。

我尝试添加这个但没有结果

@Override
public void addResourceHandlers(final ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
    registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
    super.addResourceHandlers(registry);
}

我知道我可以手动添加 src/main/,但我想了解为什么它无法正常工作。我还尝试了 ResourceLoader 的示例 - 但同样没有结果。

谁能告诉我问题出在哪里?

更新: 仅供将来参考 - 在构建项目后,我遇到了访问文件的问题,所以我将 File 更改为 InputStream

InputStream is = new ClassPathResource("countries.xml").getInputStream();

只需使用 Spring 输入 ClassPathResource.

File file = new ClassPathResource("countries.xml").getFile();

只要这个文件在类路径中的某处,Spring 就会找到它。这可以是 src/main/resources 在开发和测试期间。在生产中,它可以是当前 运行 目录。

编辑: 如果文件在 fat JAR 中,则此方法不起作用。在这种情况下,您需要使用:

InputStream is = new ClassPathResource("countries.xml").getInputStream();

获取类路径中的文件:

Resource resource = new ClassPathResource("countries.xml");
File file = resource.getFile();

要在启动时读取文件,请使用 @PostConstruct:

@Configuration
public class ReadFileOnStartUp {

    @PostConstruct
    public void afterPropertiesSet() throws Exception {

        //Gets the XML file under src/main/resources folder
        Resource resource = new ClassPathResource("countries.xml");
        File file = resource.getFile();
        //Logic to read File.
    }
}

这里是 Small example 用于在 Spring Boot App 启动时读取 XML 文件。

在使用 Spring 启动应用程序时,当它部署为 JAR 时,很难使用 resource.getFile() 获取类路径资源,因为我遇到了同样的问题。 此扫描使用 Stream 解决,它将找出放置在类路径中任何位置的所有资源。

下面是相同的代码片段 -

ClassPathResource classPathResource = new ClassPathResource("fileName");
InputStream inputStream = classPathResource.getInputStream();
content = IOUtils.toString(inputStream);

您需要使用以下构造

InputStream in = getClass().getResourceAsStream("/yourFile");

请注意,您必须在文件名前添加斜杠。

您可以使用以下代码从资源文件夹中读取字符串中的文件。

final Resource resource = new ClassPathResource("public.key");
String publicKey = null;
try {
     publicKey = new String(Files.readAllBytes(resource.getFile().toPath()), StandardCharsets.UTF_8);
} catch (IOException e) {
     e.printStackTrace();
}

我用spring启动,所以我可以简单使用:

File file = ResourceUtils.getFile("classpath:myfile.xml");

我用Spring引导,我的解决方法是

"src/main/resources/myfile.extension"

希望对大家有所帮助。

Because java.net.URL is not adequate for handling all kinds of low level resources, Spring introduced org.springframework.core.io.Resource. To access resources, we can use @Value annotation or ResourceLoader class. @Autowired private ResourceLoader resourceLoader;

@Override public void 运行(String...args) 抛出异常 {

    Resource res = resourceLoader.getResource("classpath:thermopylae.txt");

    Map<String, Integer> words =  countWords.getWordsCount(res);

    for (String key : words.keySet()) {

        System.out.println(key + ": " + words.get(key));
    }
}