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

时间:2016-04-02 09:52:43

标签: java spring spring-boot resources spring-properties

我正在开发一个Spring Boot应用程序。我需要在启动时解析XML文件(countries.xml)。问题是我不明白把它放到哪里以便我可以访问它。 我的文件夹结构是

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

我的第一个想法是将它放在src / main / resources中,但是当我尝试创建File(countries.xml)时,我得到一个NPE,堆栈跟踪显示我的文件在ProjectDirectory中查找(所以src / main / resources /未添加)。我尝试创建File(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();

8 个答案:

答案 0 :(得分:104)

只需使用Spring类型ClassPathResource

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

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

答案 1 :(得分:8)

要获取类路径中的文件:

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

要阅读文件onStartup,请使用@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文件。

答案 2 :(得分:8)

在使用Spring Boot应用程序时,当我面临同样的问题时,在部署为JAR时使用resource.getFile()很难获得类路径资源。 使用Stream解析此扫描,它将找出放在类路径中任何位置的所有资源。

以下是相同的代码段 -

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

答案 3 :(得分:1)

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

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();
}

答案 4 :(得分:0)

您需要使用以下构造

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

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

答案 5 :(得分:0)

我使用弹簧靴,所以我可以简单地使用它:

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

答案 6 :(得分:0)

我使用Spring Boot,我的解决方法是

"src/main/resources/myfile.extension"

希望它可以帮助某人。

答案 7 :(得分:0)

  

由于java.net.URL不足以处理各种低级资源,Spring引入了org.springframework.core.io.Resource。要访问资源,我们可以使用@Value批注或ResourceLoader类。   @Autowired       私有ResourceLoader resourceLoader;

@Override     public void run(String ... args)引发异常{

[
//Quantity of Widgets Owned
  1: [
       {age: 29, numberOfPeople: 8},
       {age: 30, numberOfPeople: 5}...
     ],
  2: [
       {age: 29, numberOfPeople: 2},
       {age: 30, numberOfPeople: 7}...
      ] ...
]