Ich benutze Spring Boot und json-schema-validator
. Ich versuche, eine Datei namens jsonschema.json
aus dem Ordner resources
zu lesen. Ich habe ein paar verschiedene Möglichkeiten ausprobiert, aber ich kann nicht, dass es funktioniert. Das ist mein Code.
ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource("jsonschema.json").getFile());
JsonNode mySchema = JsonLoader.fromFile(file);
Dies ist der Ort der Datei.
Und hier kann ich die Datei im Ordner classes
sehen.
Aber wenn ich den Code ausführte, erhalte ich die folgende Fehlermeldung.
jsonSchemaValidator error: Java.io.FileNotFoundException: /home/user/Dev/Java/Java%20Programs/SystemRoutines/target/classes/jsonschema.json (No such file or directory)
Was mache ich falsch in meinem Code?
Nachdem ich viel Zeit damit verbracht hatte, dieses Problem zu lösen, fand ich endlich eine Lösung, die funktioniert. Die Lösung verwendet Spring ResourceUtils . Sollte auch für json-Dateien funktionieren.
Danke für die gut geschriebene Seite von 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;
}
}
Sehr kurze Antwort: Sie suchen Ihre Immobilie im Rahmen eines bestimmten Klassenladers anstelle Ihrer Zielklasse. Das sollte funktionieren:
File file = new File(getClass().getResource("jsonschema.json").getFile());
JsonNode mySchema = JsonLoader.fromFile(file);
Siehe auch:
P.S. Es kann ein Problem auftreten, wenn das Projekt auf einem Computer kompiliert wurde und danach auf einem anderen Computer gestartet wurde oder Sie Ihre App in Docker ausführen. In diesem Fall können die Pfade zu Ihrem Ressourcenordner ungültig sein. In diesem Fall ist es besser, den Pfad zu Ihren Ressourcen zur Laufzeit zu bestimmen:
ClassPathResource res = new ClassPathResource("jsonschema.json");
File file = new File(res.getPath());
JsonNode mySchema = JsonLoader.fromFile(file);
wenn Sie beispielsweise den Ordner config unter Ressourcenordner .__ haben. Ich habe versucht, dass diese Klasse einwandfrei funktioniert
File file = ResourceUtils.getFile("classpath:config/sample.txt")
//Read File Content
String content = new String(Files.readAllBytes(file.toPath()));
System.out.println(content);
in der gleichen Ausgabe stecken, hilft mir das
URL resource = getClass().getClassLoader().getResource("jsonschema.json");
JsonNode jsonNode = JsonLoader.fromURL(resource);
Siehe meine Antwort hier: https://stackoverflow.com/a/56854431/4453282
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
Verwenden Sie diese 2 Importe.
Erklären
@Autowired
ResourceLoader resourceLoader;
Verwenden Sie dies in einigen Funktionen
Resource resource=resourceLoader.getResource("classpath:preferences.json");
In Ihrem Fall, wenn Sie die Datei benötigen, können Sie Folgendes verwenden
File file = resource.getFile()
Referenz: http://frugalisminds.com/spring/load-file-classpath-spring-boot/ Wie bereits in den vorherigen Antworten erwähnt, verwenden Sie ResourceUtils nicht, es funktioniert nach der Bereitstellung von JAR nicht. Dies funktioniert sowohl in IDE als auch nach der Bereitstellung
Hier ist meine Lösung. Kann jemandem helfen;
Es gibt InputStream zurück, aber ich gehe davon aus, dass Sie auch davon lesen können.
InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("jsonschema.json");