web-dev-qa-db-fra.com

Lire le fichier du dossier des ressources dans Spring Boot

J'utilise Spring Boot et json-schema-validator. J'essaie de lire un fichier appelé jsonschema.json à partir du dossier resources. J'ai essayé plusieurs façons mais je n'arrive pas à le faire fonctionner. Ceci est mon code.

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

Ceci est l'emplacement du fichier.

 enter image description here

Et ici je peux voir le fichier dans le dossier classes.

 enter image description here

Mais lorsque je lance le code, l'erreur suivante apparaît.

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

Qu'est-ce que je fais mal dans mon code?

24
g3blv

Après avoir passé beaucoup de temps à essayer de résoudre ce problème, nous avons finalement trouvé une solution qui fonctionne. La solution utilise les ressources ResourceUtils . De Spring qui devraient également fonctionner pour les fichiers json.

Merci pour la page bien écrite de Lokesh Gupta: Blog

 enter image description here

package utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.ResourceUtils;

import Java.io.FileInputStream;
import Java.io.IOException;
import Java.io.InputStream;
import Java.util.Properties;
import Java.io.File;


public class Utils {

    private static final Logger LOGGER = LoggerFactory.getLogger(Utils.class.getName());

    public static Properties fetchProperties(){
        Properties properties = new Properties();
        try {
            File file = ResourceUtils.getFile("classpath:application.properties");
            InputStream in = new FileInputStream(file);
            properties.load(in);
        } catch (IOException e) {
            LOGGER.error(e.getMessage());
        }
        return properties;
    }
}
37
John

Réponse très courte: vous recherchez votre propriété dans le cadre d'un chargeur de classe particulier au lieu de votre classe cible. Cela devrait fonctionner:

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

Aussi, voir ceci: 

P.S. il peut y avoir un problème si le projet a été compilé sur une machine et ensuite lancé sur une autre ou si vous exécutez votre application dans Docker. Dans ce cas, les chemins d'accès à votre dossier de ressources peuvent être invalides. Dans ce cas, il serait préférable de déterminer les chemins d'accès à vos ressources au moment de l'exécution:

ClassPathResource res = new ClassPathResource("jsonschema.json");    
File file = new File(res.getPath());
JsonNode mySchema = JsonLoader.fromFile(file);
16
Sergey Povisenko

si vous avez par exemple un dossier de configuration sous le dossier de ressources .__, j’ai essayé cette classe de fonctionner parfaitement, espérons-le.

File file = ResourceUtils.getFile("classpath:config/sample.txt")

//Read File Content
String content = new String(Files.readAllBytes(file.toPath()));
System.out.println(content);
3
Ismail

coincé dans le même problème cela m'aide

URL resource = getClass().getClassLoader().getResource("jsonschema.json");
JsonNode jsonNode = JsonLoader.fromURL(resource);
1
Govind Singh

Voici ma solution. Peut aider quelqu'un; 

Il renvoie InputStream, mais je suppose que vous pouvez également le lire.

InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("jsonschema.json");
0
Erçin Akçay