我正在开发一个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();
答案 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}...
] ...
]