2017-06-06 154 views
8

我正在使用Spring Boot和json-schema-validator。我试图从resources文件夹中读取一个名为jsonschema.json的文件。我尝试了几种不同的方法,但是我无法使其工作。这是我的代码。从Spring Boot中的资源文件夹读取文件

ClassLoader classLoader = getClass().getClassLoader(); 
File file = new File(classLoader.getResource("jsonschema.json").getFile()); 
JsonNode mySchema = JsonLoader.fromFile(file); 

这是文件的位置。

enter image description here

在这里,我可以看到在classes文件夹中的文件。

enter image description here

但是当我运行的代码我碰到下面的错误。

jsonSchemaValidator error: java.io.FileNotFoundException: /home/user/Dev/Java/Java%20Programs/SystemRoutines/target/classes/jsonschema.json (No such file or directory) 

这是什么我做错了我的代码?

+0

你可以试试这个? 'ClassLoader classLoader = getClass()。getClassLoader(); ());' – harshavmb

回答

9

很简短的回答:你正在寻找你的财产在一个特定的类加载器的范围,而不是你的目标类。这应该工作:

File file = new File(getClass().getResource("jsonschema.json").getFile()); 
JsonNode mySchema = JsonLoader.fromFile(file); 

而且,看到这一点:

附:如果项目已经在一台机器上编译,然后在另一台机器上启动,或者在Docker中运行应用程序,则可能会出现问题。在这种情况下,资源文件夹的路径可能无效。在这种情况下,它会更好,在运行时确定的路径到你的资源:

ClassPathResource res = new ClassPathResource("jsonschema.json");  
File file = new File(res.getPath()); 
JsonNode mySchema = JsonLoader.fromFile(file); 
+0

'getClass()。getResource(“jsonschema.json”)''返回'null'。我也试过'ClassPathResource res = new ClassPathResource(“jsonschema.json”)'',它只返回'jsonschema.json'。这与我使用Spring Boot有关吗? – g3blv

+0

不,这是一种常见的做法 –

0

陷入同样的​​问题,这可以帮助我

URL resource = getClass().getClassLoader().getResource("jsonschema.json"); 
JsonNode jsonNode = JsonLoader.fromURL(resource); 
+0

实际上,这与给出的答案几乎相同 有关更多详细信息,请参阅https://stackoverflow.com/questions/14739550/difference-between-getclass-getclassloader-getresource-and-getclass -getres –