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.
Et ici je peux voir le fichier dans le dossier classes
.
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?
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
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;
}
}
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);
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);
coincé dans le même problème cela m'aide
URL resource = getClass().getClassLoader().getResource("jsonschema.json");
JsonNode jsonNode = JsonLoader.fromURL(resource);
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");