Ich kann mein Spring-Boot-Projekt nicht dazu bringen, statischen Inhalt bereitzustellen.
Ich habe einen Ordner mit dem Namen static
unter platziert src/main/resources
. Darin habe ich einen Ordner namens images
. Wenn ich die App packe und ausführe, kann sie die Bilder, die ich in diesem Ordner abgelegt habe, nicht finden.
Ich habe versucht , die statischen Dateien in setzen public
, resources
und META-INF/resources
aber nichts funktioniert.
Wenn ich jar -tvf app.jar habe, kann ich sehen, dass sich die Dateien im jar im richtigen Ordner befinden: /static/images/head.png
zum Beispiel, aber wenn ich anrufe, bekomme ich
http://localhost:8080/images/head.png
nur a404
Irgendwelche Ideen, warum Spring-Boot dies nicht findet? (Ich benutze 1.1.4 BTW)
spring
spring-mvc
spring-boot
Vinicius Carvalho
quelle
quelle
@EnableWebMvc
(oder gleichwertig) in Ihrer App. Das würde die Standard-Boot-MVC-Konfiguration ausschalten.Antworten:
Nicht um die Toten nach mehr als einem Jahr zu erwecken, aber alle vorherigen Antworten verfehlen einige entscheidende Punkte:
@EnableWebMvc
auf Ihrer Klasse wird deaktiviertorg.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration
. Das ist in Ordnung, wenn Sie die vollständige Kontrolle wünschen, aber ansonsten ist es ein Problem.Es ist nicht erforderlich, Code zu schreiben, um zusätzlich zu den bereits bereitgestellten einen weiteren Speicherort für statische Ressourcen hinzuzufügen. In
org.springframework.boot.autoconfigure.web.ResourceProperties
Version 1.3.0.RELEASE sehe ich ein FeldstaticLocations
, das in der konfiguriert werden kannapplication.properties
. Hier ist ein Ausschnitt aus der Quelle:Wie bereits erwähnt, wird die Anforderungs-URL relativ zu diesen Speicherorten aufgelöst. Somit
src/main/resources/static/index.html
wird zugestellt, wenn die Anforderungs-URL lautet/index.html
. Die Klasse, die ab Spring 4.1 für die Auflösung des Pfads verantwortlich ist, istorg.springframework.web.servlet.resource.PathResourceResolver
.Der Suffix-Mustervergleich ist standardmäßig aktiviert. Dies bedeutet
/index.html
, dass Spring für eine Anforderungs-URL nach entsprechenden Handlern sucht/index.html
. Dies ist ein Problem, wenn statische Inhalte bereitgestellt werden sollen. Um dies zu deaktivieren, erweiternWebMvcConfigurerAdapter
(aber nicht verwenden@EnableWebMvc
) und überschreiben SieconfigurePathMatch
wie unten gezeigt:IMHO, die einzige Möglichkeit, weniger Fehler in Ihrem Code zu haben, besteht darin, wann immer möglich keinen Code zu schreiben. Verwenden Sie das, was bereits bereitgestellt wurde, auch wenn dies einige Nachforschungen erfordert, die Rückgabe lohnt sich.
quelle
Anders als im Spring-Boot-Status, damit mein Spring-Boot-JAR den Inhalt bereitstellt: Ich musste meinen src / main / resources / static-Inhalt über diese Konfigurationsklasse spezifisch registrieren:
quelle
Ich hatte ein ähnliches Problem und es stellte sich heraus, dass die einfache Lösung darin bestand, meine Konfigurationsklasse zu erweitern
WebMvcAutoConfiguration
:Ich brauchte keinen anderen Code, um meinen statischen Inhalt bereitstellen zu können. Ich habe jedoch ein Verzeichnis namens
public
untersrc/main/webapp
abgelegt und maven so konfiguriert, dass essrc/main/webapp
als Ressourcenverzeichnis verweist . Dies bedeutet, dass das Objektpublic
kopierttarget/classes
wird und sich daher zur Laufzeit im Klassenpfad befindet, damit Spring-Boot / Tomcat es finden kann.quelle
Suchen Sie nach Controllern, die "/" zugeordnet sind oder denen kein Pfad zugeordnet ist.
Ich hatte ein Problem wie dieses, bekam 405 Fehler und schlug mir tagelang den Kopf hart. Das Problem stellte sich als
@RestController
kommentierter Controller heraus, den ich vergessen hatte, mit einer@RequestMapping
Anmerkung zu kommentieren . Ich denke, dieser zugeordnete Pfad war standardmäßig "/" und blockierte die Zuordnung der Ressourcen für statische Inhalte.quelle
Die Konfiguration könnte wie folgt erfolgen:
Wichtig hierbei ist, dass Ihre Methode
WebMvcConfig
möglicherweise überschriebenaddResourceHandlers
wird und Sie daher explizit aufrufen müssensuper.addResourceHandlers(registry)
(wenn Sie mit den Standardressourcenpositionen zufrieden sind, müssen Sie keine Methode überschreiben).Eine andere Sache , die Bedürfnisse hier kommentiert werden soll , dass diese Standardressourcenstellen (
/static
,/public
,/resources
und/META-INF/resources
) nur dann registriert werden , wenn es nicht bereits eine Ressource Handler zugeordnet/**
.Von diesem Moment an können Sie, wenn Sie beispielsweise ein Image mit einem
src/main/resources/static/images
Namen habenimage.jpg
, über die folgende URL darauf zugreifen:http://localhost:8080/images/image.jpg
( Dies ist der Server, der über Port 8080 gestartet und die Anwendung im Stammkontext bereitgestellt wurde).quelle
@EnableWebMvc
undWebMvcAutoConfigurationAdapter
. Vielen Dank!Haben Sie die Spring Boot-Referenzdokumente überprüft ?
Sie können Ihr Projekt auch mit dem Handbuch Serving Web Content mit Spring MVC vergleichen oder den Quellcode des Spring-Boot-Sample-Web-UI- Projekts überprüfen .
quelle
Ich hatte genau dieses Problem und stellte dann fest, dass ich in meiner application.properties definiert hatte:
Was alles andere außer Kraft setzte, was ich versucht hatte. In meinem Fall wollte ich beides behalten, also habe ich einfach das Eigentum behalten und hinzugefügt:
Welche Dateien von src / main / resources / static als localhost bereitgestellt wurden: {port} /file.html.
Keiner der oben genannten Punkte hat für mich funktioniert, da niemand diese kleine Eigenschaft erwähnt hat, die leicht aus dem Internet hätte kopiert werden können, um einen anderen Zweck zu erfüllen;)
Ich hoffe es hilft! Ich dachte, es würde gut in diesen langen Beitrag mit Antworten für Menschen mit diesem Problem passen.
quelle
spring.resources.static-locations=file:/var/www/static,classpath:static
in meine application.properties ein, aber es hat bei mir nicht funktioniert. Ich verwende@EnableWebMvc
für meine Konfigurationsklasse.security.ignored
undsecurity.publicPaths
Ich denke, die vorherigen Antworten sprechen das Thema sehr gut an. Ich möchte jedoch hinzufügen, dass Sie in einem Fall, wenn Sie Spring Security in Ihrer Anwendung aktiviert haben, Spring möglicherweise ausdrücklich anweisen müssen, Anforderungen an andere statische Ressourcenverzeichnisse wie z. B. "/ static / fonts" zuzulassen .
In meinem Fall war "/ static / css", "/ static / js", "/ static / images" standardmäßig zulässig, aber / static / fonts / ** wurde von meiner Spring Security-Implementierung blockiert.
Unten sehen Sie ein Beispiel, wie ich das behoben habe.
quelle
Nur um noch eine weitere Antwort auf eine alte Frage hinzuzufügen ... Die Leute haben erwähnt
@EnableWebMvc
, dass dasWebMvcAutoConfiguration
Laden verhindert wird. Dies ist der Code, der für die Erstellung der statischen Ressourcenhandler verantwortlich ist. Es gibt andere Bedingungen, die dasWebMvcAutoConfiguration
Laden ebenfalls verhindern . Der klarste Weg, dies zu sehen, ist ein Blick auf die Quelle:https://github.com/spring-projects/spring-boot/blob/master/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/servlet/ WebMvcAutoConfiguration.java # L139-L141
In meinem Fall habe ich eine Bibliothek mit einer Klasse hinzugefügt,
WebMvcConfigurationSupport
die erweitert wurde. Dies ist eine Bedingung, die die automatische Konfiguration verhindert:Es ist wichtig, sich niemals zu verlängern
WebMvcConfigurationSupport
. Erweitern Sie stattdessen vonWebMvcConfigurerAdapter
.UPDATE: Der richtige Weg, dies in 5.x zu tun, ist die Implementierung von WebMvcConfigurer
quelle
WebMvcConfigurer
.Diese Lösung funktioniert bei mir:
Legen Sie zunächst einen Ressourcenordner unter webapp / WEB-INF ab, wie folgt
Zweitens im Frühjahr Konfigurationsdatei
Anschließend können Sie auf Ihre Ressourceninhalte zugreifen, z. B. http: // localhost: 8080 / resource / image / yourimage.jpg
quelle
Es sind zwei Dinge zu beachten (Spring Boot v1.5.2.RELEASE) - 1) Überprüfen Sie alle Controller-Klassen auf @ EnableWebMvc-Annotation, entfernen Sie sie, falls vorhanden. 2) Überprüfen Sie die Controller-Klassen, für die Annotation verwendet wird - @RestController oder @Controller . Mischen Sie das Rest-API- und MVC-Verhalten nicht in einer Klasse. Verwenden Sie für MVC @Controller und für die REST-API @RestController
Wenn ich mehr als zwei Dinge tue, ist mein Problem behoben. Jetzt lädt mein Spring Boot statische Ressourcen ohne Probleme. @Controller => index.html laden => lädt statische Dateien.
quelle
Legen Sie statische Ressourcen in das Verzeichnis:
Fügen Sie diese Eigenschaft in die Datei application.properties ein
Sie können von http: // localhost: 8080 / pdx / images / image.jpg zugreifen
quelle
Falls das Problem beim Starten der Anwendung aus einer IDE (dh ausgehend von Eclipse oder IntelliJ Idea) und bei Verwendung von Maven auftritt, befindet sich der Schlüssel zur Lösung in der Spring-Boot- Dokumentation Erste Schritte :
Der wichtige Teil davon ist das Hinzufügen des
package
Ziels, das ausgeführt werden soll, bevor die Anwendung tatsächlich gestartet wird. (Idee:Run
MenüEdit Configrations...
,Add
und es auszuwählenRun Maven Goal
, und geben Sie daspackage
Ziel im Feld)quelle
Ich verwende 1.3.5 und hoste eine Reihe von REST-Diensten über die Jersey-Implementierung. Das hat gut funktioniert, bis ich mich entschied, ein paar HTMLs + js-Dateien hinzuzufügen. Keine der Antworten in diesem Forum hat mir geholfen. Als ich jedoch die folgende Abhängigkeit in meine pom.xml einfügte, wurde der gesamte Inhalt in src / main / resources / static endlich über den Browser angezeigt:
Es scheint, dass spring-web / spring-webmvc die wichtige transitive Abhängigkeit ist, die die automatische Konfiguration von Spring Boot aktiviert.
quelle
Zu Ihrer Information: Mir ist auch aufgefallen, dass ich eine perfekt funktionierende Spring Boot-App durcheinander bringen und verhindern kann, dass sie Inhalte aus dem statischen Ordner bereitstellt, wenn ich so einen fehlerhaften Rest-Controller hinzufüge
In diesem Beispiel lautet die Fehlerantwort nach dem Hinzufügen des fehlerhaften Controllers zum Projekt, wenn der Browser nach einer im statischen Ordner verfügbaren Datei fragt, " 405 Methode nicht zulässig ".
Hinweispfade werden im Beispiel für einen fehlerhaften Controller nicht zugeordnet.
quelle
Ich hatte das gleiche Problem in Spring Boot 2.1.3 und sagte, dass die Ressource nicht gefunden wurde 404. Ich habe sie unten aus applicationatiion.properties entfernt .
Entfernt @enableWebMVC und entfernt jeder WebMvcConfigurer überwiegend
Stellen Sie außerdem sicher, dass Ihre Konfiguration @EnableAutoConfiguration enthält .
Und füge alle statischen Ressourcen in src / main / resources / static ein und es hat endlich wie Magie funktioniert.
quelle
Mit Spring Boot 2. * habe ich einen Controller, der Routen zuordnet
GetMapping({"/{var}", "/{var1}/{var2}", "/{var1}/{var2}/{var3}"})
und meine App boomt und keine Ressourcen mehr bereitstellt.Ich weiß, dass es nicht ratsam ist, solche Routen zu haben, aber alles hängt von der App ab, die Sie erstellen (in meinem Fall habe ich keine andere Wahl, als solche Routen zu haben).
Hier ist mein Hack, um sicherzustellen, dass meine App wieder Ressourcen bereitstellt. Ich habe einfach einen Controller, der meinen Ressourcen zugeordnet ist. Da der Frühling zuerst einer direkten Route entspricht, bevor eine Variable vorhanden ist, habe ich beschlossen, eine Controller-Methode hinzuzufügen, die
/imgaes/{name}
für andere Ressourcen zugeordnet und wiederholt wirdund das löste mein Problem
quelle
Hatte das gleiche Problem mit Gradle und Eclipse und verbrachte Stunden damit, es herauszufinden.
Keine Codierung erforderlich. Der Trick besteht darin, dass Sie die Menüoption Neu-> Quellordner (NICHT Neu -> Ordner) verwenden müssen, um den statischen Ordner unter src / main / resources zu erstellen. Ich weiß nicht, warum dies funktioniert, habe aber einen neuen -> Quellordner erstellt, dann habe ich den Ordner statisch benannt (dann gibt der Quellordner-Dialog einen Fehler aus, für den Sie Folgendes überprüfen müssen: Aktualisieren Sie die Ausschlussfilter in anderen Quellordnern, um die Verschachtelung zu lösen). Den neuen statischen Ordner habe ich index.html hinzugefügt und jetzt funktioniert es.
quelle
Manchmal lohnt es sich zu überprüfen, ob Sie die globalen Zuordnungen von einem Rest-Controller überschrieben haben. Einfacher Beispielfehler (Kotlin):
Im obigen Fall erhalten Sie, wenn Sie statische Ressourcen anfordern:
Der Grund dafür könnte sein, dass Sie eine Zuordnung vornehmen wollten
@PostMapping
,/foo
aber die@RequestMapping
Anmerkungen auf der@RestController
Ebene vergessen haben. In diesem Fall werden alle Anforderungen zugeordnet,POST
und in diesem Fall erhalten Sie keinen statischen Inhalt.quelle
Wenn Sie unter Code unter src / main / resources / static diesen Code hinzufügen, ist der gesamte statische Inhalt von src / main / resources / static unter "/" verfügbar:
quelle
In meinem Fall wurden einige statische Dateien nicht bereitgestellt, z. B. .woff-Schriftarten und einige Bilder. Aber CSS und JS haben gut funktioniert.
Update: Eine viel bessere Lösung, damit Spring Boot die Woff-Schriftarten korrekt bereitstellt, besteht beispielsweise darin, die in dieser Antwort erwähnte Ressourcenfilterung zu konfigurieren (beachten Sie, dass Sie sowohl Ein- als auch Ausschlüsse benötigen):
----- Alte Lösung (funktioniert, beschädigt aber einige Schriftarten) -----
Eine andere Lösung bestand darin, die Übereinstimmung von Suffixmustern mit zu deaktivieren
setUseSuffixPatternMatch(false)
Credits: @Abhiji hat mich mit 4. in die richtige Richtung gelenkt!
quelle
Anforderungen an / ** werden an statischen Speicherorten ausgewertet, die in resourceProperties konfiguriert sind .
Das Hinzufügen von Folgendem zu application.properties ist möglicherweise das einzige, was Sie tun müssen ...
Dadurch werden statische Standardspeicherorte überschrieben, die:
Möglicherweise möchten Sie dies nicht tun und nur sicherstellen, dass Ihre Ressourcen in einem dieser Standardordner landen.
Ausführen einer Anfrage: Wenn ich example.html in /public/example.html gespeichert hätte, kann ich folgendermaßen darauf zugreifen:
Wenn ich eine andere URL wie
<host>/<context-path>/magico/*
für Dateien im Klassenpfad haben möchte : / magicofiles / *, brauchst du etwas mehr Konfigurationquelle
Wie oben erwähnt, sollte sich die Datei in
$ClassPath/static/images/name.png
(/ static oder / public oder / resources oder / META-INF / resources) befinden. Dieser $ ClassPath bedeutetmain/resources
odermain/java
dir.Wenn sich Ihre Dateien nicht in Standardverzeichnissen befinden, können Sie die folgende Konfiguration hinzufügen:
}}
quelle