it-swarm.com.de

Spring Boot-Zugriff auf statische Ressourcen, für die Scr/Main/Ressourcen fehlen

Ich arbeite an einer Spring Boot-Anwendung. Ich muss beim Start eine XML-Datei (countries.xml) analysieren. Das Problem ist, dass ich nicht verstehe, wo ich es ablegen soll, damit ich darauf zugreifen kann. Meine Ordnerstruktur ist 

ProjectDirectory/src/main/Java
ProjectDirectory/src/main/resources/countries.xml

Meine erste Idee war, es in src/main/resources zu packen, aber wenn ich versuche, File (countries.xml) zu erstellen, bekomme ich eine NPE und der Stacktrace zeigt an, dass meine Datei im Projektverzeichnis (also src/main/resources/wird nicht hinzugefügt). Ich habe versucht, File (resources/countries.xml) zu erstellen, und der Pfad würde wie ProjectDirectory/resources/countries.xml aussehen (daher wird src/main nicht hinzugefügt).

Ich habe versucht, dies ohne Ergebnis hinzuzufügen

@Override
public void addResourceHandlers(final ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
    registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
    super.addResourceHandlers(registry);
}

Ich weiß, dass ich src/main/manuell hinzufügen kann, aber ich möchte verstehen, warum es nicht so funktioniert wie es muss. Ich habe auch Beispiele mit ResourceLoader ausprobiert - mit dem gleichen Ergebnis. 

Könnte jemand vorschlagen, was das Problem ist?

UPDATE: Nur für zukünftige Referenzen - Nachdem ich das Projekt erstellt hatte, bin ich auf Probleme beim Zugriff auf die Datei gestoßen, also habe ich File in InputStream geändert 

InputStream is = new ClassPathResource("countries.xml").getInputStream();
47
lenach87

Verwenden Sie einfach den Spring-Typ ClassPathResource .

File file = new ClassPathResource("countries.xml").getFile();

Solange sich diese Datei irgendwo auf Classpath befindet, wird Spring sie finden. Dies kann während der Entwicklung und beim Testen src/main/resources sein. In der Produktion kann es sich um ein aktuell ausgeführtes Verzeichnis handeln.

95
luboskrnac

Bei der Arbeit mit der Spring Boot-Anwendung ist es schwierig, die Klassenpfadressourcen mit resource.getFile() zu beziehen, wenn sie als JAR bereitgestellt werden, da ich das gleiche Problem hatte. Dieser Scan wird mit Stream aufgelöst, wodurch alle Ressourcen ermittelt werden, die sich irgendwo im Klassenpfad befinden.

Unten ist der Code-Ausschnitt für dasselbe -

ClassPathResource classPathResource = new ClassPathResource("fileName");
InputStream inputStream = classPathResource.getInputStream();
content = IOUtils.toString(inputStream);
8

So rufen Sie die Dateien im Klassenpfad ab:

Resource resource = new ClassPathResource("countries.xml");
File file = resource.getFile();

Um die Datei im Startup zu lesen, verwenden Sie @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.
    }
}

Hier ist ein kleines Beispiel zum Lesen einer XML-Datei beim Start der Spring Boot App.

8
Sanjay Rawat

Sie können folgenden Code verwenden, um die Datei in String aus dem Ressourcenordner zu lesen.

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();
}
1
snj

Ich benutze Spring Boot, also kann ich einfach verwenden:

File file = ResourceUtils.getFile("classpath:myfile.xml");
0
Galley

Sie müssen folgende Konstruktion verwenden 

InputStream in = getClass().getResourceAsStream("/yourFile");

Bitte beachten Sie, dass Sie diesen Schrägstrich vor Ihrem Dateinamen hinzufügen müssen.

0
Andrew Gans

Ich benutze Spring Boot, meine Lösung für das Problem war

"src/main/resources/myfile.extension"

Hoffe es hilft jemandem.

0