Spring Boot liefert keinen statischen Inhalt


173

Ich kann mein Spring-Boot-Projekt nicht dazu bringen, statischen Inhalt bereitzustellen.

Ich habe einen Ordner mit dem Namen staticunter 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, resourcesund META-INF/resourcesaber 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.pngzum Beispiel, aber wenn ich anrufe, bekomme ich http://localhost:8080/images/head.pngnur a404

Irgendwelche Ideen, warum Spring-Boot dies nicht findet? (Ich benutze 1.1.4 BTW)


6
Die Standard-Ressourcenbehandlung ist / ** zugeordnet. Ich würde noch einmal überprüfen, ob es aktiviert ist. Wenn dies der Fall ist, wird beim Starten der App in der Ausgabe eine Zeile angezeigt, die mit "Zugeordneter URL-Pfad [/ **] auf Handler vom Typ [Klasse org.springframework.web.servlet.resource.ResourceHttpRequestHandler]" endet. Eine andere Möglichkeit ist ein eigener Controller, der ebenfalls / ** zugeordnet ist und Vorrang vor dem Ressourcenhandler hat. Wenn Sie die Ausgabe des Starts Ihrer App veröffentlichen, können wir leichter sehen, was los ist.
Andy Wilkinson

12
Ich vermute, Sie haben @EnableWebMvc(oder gleichwertig) in Ihrer App. Das würde die Standard-Boot-MVC-Konfiguration ausschalten.
Dave Syer

1
Nein, ich habe nirgendwo @EnableWebMvc. Ich verstehe das nicht. Jetzt passiert es auch mit Vorlagen. Alle meine Vorlagen (Freemarker) werden vom Klassenlader von Spring Boot gefunden.
Vinicius Carvalho

2
Ich habe ein ähnliches Problem und hatte mit keiner der empfohlenen Lösungen Glück. Wenn jemand so freundlich sein könnte, einen Blick darauf zu werfen und genau darauf hinzuweisen, was ich falsch mache, wäre er sehr dankbar !!! github.com/kylebober/kbss
Kyle S. Bober

3
Ich habe festgestellt, dass wenn ich eine Datei src / main / resources / public / style.css habe, die URL dafür /style.css und nicht wie erwartet /public/style.css lautet.
Dave

Antworten:


179

Nicht um die Toten nach mehr als einem Jahr zu erwecken, aber alle vorherigen Antworten verfehlen einige entscheidende Punkte:

  1. @EnableWebMvcauf Ihrer Klasse wird deaktiviert org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration. Das ist in Ordnung, wenn Sie die vollständige Kontrolle wünschen, aber ansonsten ist es ein Problem.
  2. 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.ResourcePropertiesVersion 1.3.0.RELEASE sehe ich ein Feld staticLocations, das in der konfiguriert werden kann application.properties. Hier ist ein Ausschnitt aus der Quelle:

    /**
     * Locations of static resources. Defaults to classpath:[/META-INF/resources/,
     * /resources/, /static/, /public/] plus context:/ (the root of the servlet context).
     */
    private String[] staticLocations = RESOURCE_LOCATIONS;
  3. Wie bereits erwähnt, wird die Anforderungs-URL relativ zu diesen Speicherorten aufgelöst. Somit src/main/resources/static/index.htmlwird zugestellt, wenn die Anforderungs-URL lautet /index.html. Die Klasse, die ab Spring 4.1 für die Auflösung des Pfads verantwortlich ist, ist org.springframework.web.servlet.resource.PathResourceResolver.

  4. 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, erweitern WebMvcConfigurerAdapter(aber nicht verwenden @EnableWebMvc) und überschreiben Sie configurePathMatchwie unten gezeigt:

    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        super.configurePathMatch(configurer);
    
        configurer.setUseSuffixPatternMatch(false);
    }

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.


3
Diese Antwort ist in der Tat nach viel Forschung. Eine großartige Lektüre
Ekansh Rastogi

2
Wenn ich entscheidend wäre, würde ich diese Antwort in die Spring Boot-Dokumentation aufnehmen
aliopi

2
@Abhijit Sarkar Ich meinte die Firma Pivotal , entschuldige schlechte Gefühle, aber es war nicht beabsichtigt. Pivotal ist der Besitzer von Spring, wenn ich richtig liege. Ich könnte es dokumentieren, aber sie haben Leute, die dafür bezahlt werden, also sollten sie es tun: P
aliopi

1
@aliopi Spring ist ein Open Source Projekt.
Abhijit Sarkar

3
Die einzige Möglichkeit, weniger Fehler in Ihrem Code zu haben, besteht darin, [...] keinen Code wie diesen zu schreiben .
Clijsters

78

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:

@Configuration
public class StaticResourceConfiguration implements WebMvcConfigurer {

    private static final String[] CLASSPATH_RESOURCE_LOCATIONS = {
            "classpath:/META-INF/resources/", "classpath:/resources/",
            "classpath:/static/", "classpath:/public/" };

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**")
            .addResourceLocations(CLASSPATH_RESOURCE_LOCATIONS);
    }
}

3
Ich habe das gleiche Problem, die gleiche Version von Spring Boot, aber das hat auch bei mir nicht funktioniert
greyfox

Mein Problem in Version 1.2.5 wurde behoben !! Vielen Dank. Stimmen Sie ab!
Mrclrchtr

Dieser Hack funktioniert ... seltsam, dass die automatische Konfiguration fehlschlägt
Allan Vital

Leider funktioniert dieser Hack bei mir nicht, was aufgrund der Eleganz eine Schande ist. Ich bin nicht sicher, ob die Hauptursache die Pfade zur Ressource sind. Vielleicht müssen sie anders formatiert werden, da ich es in Windows ausführe?
Acarlstein

50

Ich hatte ein ähnliches Problem und es stellte sich heraus, dass die einfache Lösung darin bestand, meine Konfigurationsklasse zu erweitern WebMvcAutoConfiguration:

@Configuration
@EnableWebMvc
@ComponentScan
public class ServerConfiguration extends WebMvcAutoConfiguration{
}

Ich brauchte keinen anderen Code, um meinen statischen Inhalt bereitstellen zu können. Ich habe jedoch ein Verzeichnis namens publicunter src/main/webappabgelegt und maven so konfiguriert, dass es src/main/webappals Ressourcenverzeichnis verweist . Dies bedeutet, dass das Objekt publickopiert target/classeswird und sich daher zur Laufzeit im Klassenpfad befindet, damit Spring-Boot / Tomcat es finden kann.


Auf diese Weise funktionieren statische Ressourcen nicht in anderen Profilen. Zum Beispiel habe ich ein Profil für die Veröffentlichung, das eine andere IP-Adresse verwendet. Ich erhalte 404 Fehler für alle meine Ressourcen.
Mahdi

24

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 @RestControllerkommentierter Controller heraus, den ich vergessen hatte, mit einer @RequestMappingAnmerkung zu kommentieren . Ich denke, dieser zugeordnete Pfad war standardmäßig "/" und blockierte die Zuordnung der Ressourcen für statische Inhalte.


1
Hat es für mich gelöst! Ich hatte einen Controller mit @RestController ("/ blubb") versehen, was offensichtlich falsch ist, aber manchmal sieht man den Wald vor lauter Bäumen nicht. Das Ändern in @RestController @RequestMapping ("/ blubb") hat es gelöst
krinklesaurus

Ich bin froh, dass es geholfen hat, und amüsiert über die Vorstellung, dass der Ausdruck "Ich kann den Wald nicht für alle Bäume sehen" sowohl auf Deutsch als auch auf Schwedisch existiert :)
Johannes

2
Sie können @RequestMapping ("/") auch explizit hinzufügen, wenn sowohl statischer Inhalt bereitgestellt als auch ein dynamischer Handler für Root-Anforderungen bereitgestellt werden soll.
mjj1409

1
Wow ... habe 2 verschwendete Tage damit verbracht. Meine Spring Boot MVC-Anwendung verwendet Spring Security und hat die Datei styles.css nicht gesehen. Ich glaube, die Sicherheit hat den .jsp's nicht erlaubt, auf die Datei styles.css zuzugreifen. Ich hatte ein @RequestMapping ({"", "/", "/ home"}) in meinem Controller. Nahm das "" und "/" heraus und mein MVC fing an perfekt zu arbeiten ... Sehr seltsam.
Skmansfield

3
@Shafiul Nein Das Hinzufügen von EnableAutoConfiguration und SpringBootApplication ist redundant! "@SpringBootApplication" enthält die "@EnableAutoConfiguration"
Dehan de Croos

19

Die Konfiguration könnte wie folgt erfolgen:

@Configuration
@EnableWebMvc
public class WebMvcConfig extends WebMvcAutoConfigurationAdapter {

// specific project configuration

}

Wichtig hierbei ist, dass Ihre Methode WebMvcConfig möglicherweise überschrieben addResourceHandlerswird 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, /resourcesund /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/imagesNamen haben image.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).


Es ist vielleicht wichtig zu kommentieren, dass Sie addResourceHandlers zwar überschreiben können, aber nicht müssen, um das OP-Problem zu lösen.
Software Engineer

@EngineerDollery danke für den Kommentar, das war meine Absicht, aber ich fügte ausdrücklich die Erklärung hinzu
Francisco Spaeth

Ich habe mein CSS / JS in den Ordner src / main / resources / static verschoben und die Fehler sind nicht mehr vorhanden, aber ich kann das CSS immer noch nicht auf meiner Seite anzeigen lassen.
Hatem Jaber

Alter, ich bin durch die Tiefen des Internets gereist, um diese funktionierende Lösung zu finden. Es scheint, der Schlüssel war die Kombination von @EnableWebMvcund WebMvcAutoConfigurationAdapter. Vielen Dank!
Ian Newland

Auch für mich hat es nicht sofort geklappt. Ich musste das auch hinzufügen. Ich füge hier nur meinen Kommentar hinzu, weil ich zwei Probleme hatte. Ich hatte auch einen Controller, der "/" zugeordnet hat, wie @Johannes erwähnt. Dies zu tun und meinen "/" Controller zu entfernen, löste meine Probleme.
loyalBrown

11

Haben Sie die Spring Boot-Referenzdokumente überprüft ?

Standardmäßig liefert Spring Boot statischen Inhalt aus einem Ordner namens /static(oder /publicoder /resourcesoder /META-INF/resources) im Klassenpfad oder aus dem Stammverzeichnis des ServletContext.

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 .


2
Ja, das habe ich versucht, das sind die Orte, die ich ausprobiert habe, genau wie in den Dokumenten angegeben. Aber nichts funktioniert. Ich verstehe nicht, warum die Ressource überhaupt nicht gefunden wird. Ich habe versucht, die Beispiele zu untersuchen. Seltsamerweise gibt es kein Beispiel, das die von den Dokumenten vorgeschlagene Struktur verwendet. Der gerade eingefügte verwendet einen Vorlagenordner. Ich gehe davon aus, dass dies für eine Thymeleaf-Konfiguration oder Geschwindigkeit gilt.
Vinicius Carvalho


Ich stimme @ViniciusCarvalho zu, ich habe jede mögliche Kombination ausprobiert, um die CSS / JS an die richtige Stelle zu bringen, und kann das anscheinend nicht. Selbst wenn ich localhost: 8089 / css / styles.css besuche, sehe ich nichts. Ich habe nur eine einzige Regel, um die Körperfarbe zu ändern.
Hatem Jaber

10

Ich hatte genau dieses Problem und stellte dann fest, dass ich in meiner application.properties definiert hatte:

spring.resources.static-locations=file:/var/www/static

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:

spring.resources.static-locations=file:/var/www/static,classpath:static

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.


Ich verwende Spring Boot 2.0.5.RELEASE und füge es spring.resources.static-locations=file:/var/www/static,classpath:staticin meine application.properties ein, aber es hat bei mir nicht funktioniert. Ich verwende @EnableWebMvcfür meine Konfigurationsklasse.
N. Ngo

Dies war derjenige, der mein Problem gelöst hat. zusammen mit security.ignoredundsecurity.publicPaths
JoSSte

5

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.

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
.....
    @Override
    protected void configure(final HttpSecurity http) throws Exception {
        http.authorizeRequests().antMatchers("/", "/fonts/**").permitAll().
        //other security configuration rules
    }
.....
}

5

Nur um noch eine weitere Antwort auf eine alte Frage hinzuzufügen ... Die Leute haben erwähnt @EnableWebMvc, dass das WebMvcAutoConfigurationLaden verhindert wird. Dies ist der Code, der für die Erstellung der statischen Ressourcenhandler verantwortlich ist. Es gibt andere Bedingungen, die das WebMvcAutoConfigurationLaden 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, WebMvcConfigurationSupportdie erweitert wurde. Dies ist eine Bedingung, die die automatische Konfiguration verhindert:

@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)

Es ist wichtig, sich niemals zu verlängern WebMvcConfigurationSupport. Erweitern Sie stattdessen von WebMvcConfigurerAdapter.

UPDATE: Der richtige Weg, dies in 5.x zu tun, ist die Implementierung von WebMvcConfigurer


WebMvcConfigurerAdapter ist ab Spring Boot 5.0 veraltet. Beim Googeln wird dies in den Javadocs für diese Klasse angezeigt: "Ab 5.0 verfügt WebMvcConfigurer über Standardmethoden (ermöglicht durch eine Java 8-Baseline) und kann direkt implementiert werden, ohne dass dieser Adapter erforderlich ist." Ich denke, man implementiert jetzt WebMvcConfigurer.
Marvo

@ Marvo das ist genau richtig. Der richtige Weg, dies in 5.x zu tun, ist die Implementierung WebMvcConfigurer.
Bal

4

Diese Lösung funktioniert bei mir:

Legen Sie zunächst einen Ressourcenordner unter webapp / WEB-INF ab, wie folgt

-- src
  -- main
    -- webapp
      -- WEB-INF
        -- resources
          -- css
          -- image
          -- js
          -- ...

Zweitens im Frühjahr Konfigurationsdatei

@Configuration
@EnableWebMvc
public class MvcConfig extends WebMvcConfigurerAdapter{

    @Bean
    public ViewResolver getViewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".html");
        return resolver;
    }

    @Override
    public void configureDefaultServletHandling(
            DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resource/**").addResourceLocations("WEB-INF/resources/");
    }
}

Anschließend können Sie auf Ihre Ressourceninhalte zugreifen, z. B. http: // localhost: 8080 / resource / image / yourimage.jpg


3

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.

@Controller
public class WelcomeController {

    // inject via application.properties
    @Value("${welcome.message:Hello}")
    private String message = "Hello World";

    @RequestMapping("/")
    public String home(Map<String, Object> model) {
        model.put("message", this.message);
        return "index";
    }

}

index.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>index</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />


    <link rel="stylesheet/less" th:href="@{/webapp/assets/theme.siberia.less}"/>

    <!-- The app's logic -->
    <script type="text/javascript" data-main="/webapp/app" th:src="@{/webapp/libs/require.js}"></script>
    <script type="text/javascript">
        require.config({
            paths: { text:"/webapp/libs/text" }
        });
    </script>



   <!-- Development only -->
     <script type="text/javascript" th:src="@{/webapp/libs/less.min.js}"></script>


</head>
<body>

</body>
</html>

Das Entfernen von @EnableWebMvc hat es für mich getan! Vielen Dank
Turboemu

3

Legen Sie statische Ressourcen in das Verzeichnis:

/src/main/resources/static

Fügen Sie diese Eigenschaft in die Datei application.properties ein

server.servlet.context-path=/pdx

Sie können von http: // localhost: 8080 / pdx / images / image.jpg zugreifen

Geben Sie hier die Bildbeschreibung ein


1
Ich weiß nicht, wie ich Danke sagen soll . Bruder, du bist großartig. Ich habe fast alle oben genannten Lösungen ausprobiert, aber dies ist die beste und die kürzeste.
user12061795

2

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 :

Wenn Sie Maven verwenden, führen Sie Folgendes aus:

mvn package && java -jar target/gs-spring-boot-0.1.0.jar

Der wichtige Teil davon ist das Hinzufügen des packageZiels, das ausgeführt werden soll, bevor die Anwendung tatsächlich gestartet wird. (Idee: RunMenü Edit Configrations..., Addund es auszuwählen Run Maven Goal, und geben Sie das packageZiel im Feld)


1

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:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<dependency>

Es scheint, dass spring-web / spring-webmvc die wichtige transitive Abhängigkeit ist, die die automatische Konfiguration von Spring Boot aktiviert.


1

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

 @RestController
public class BadController {
    @RequestMapping(method= RequestMethod.POST)
    public String someMethod(@RequestParam(value="date", required=false)String dateString, Model model){
        return "foo";
    }
}

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.


1

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 .

#spring.resources.add-mappings=true
#spring.resources.static-locations=classpath:static
#spring.mvc.static-path-pattern=/**,

Entfernt @enableWebMVC und entfernt jeder WebMvcConfigurer überwiegend

// @ EnableWebMvc

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.


Meine Frühlingsversion in 2.2.6 und ich haben @EnableAutoConfiguration und Dateien unter src / main / resources / static, aber es funktioniert nicht und wirft 500.
shivani thakur

1

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 wird

@GetMapping(value = "/images/{image}", produces = {MediaType.IMAGE_GIF_VALUE, MediaType.IMAGE_JPEG_VALUE, MediaType.IMAGE_PNG_VALUE})
    public @ResponseBody
    byte[] getImage(@PathVariable String image) {
        ClassPathResource file = new ClassPathResource("static/images/" + image);
        byte[] bytes;
        try {
            bytes = StreamUtils.copyToByteArray(file.getInputStream());
        } catch (IOException e) {
            throw new ResourceNotFoundException("file not found: " + image);
        }
        return bytes;
    }

und das löste mein Problem


0

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.


0

Manchmal lohnt es sich zu überprüfen, ob Sie die globalen Zuordnungen von einem Rest-Controller überschrieben haben. Einfacher Beispielfehler (Kotlin):

@RestController("/foo")
class TrainingController {

    @PostMapping
    fun bazz(@RequestBody newBody: CommandDto): CommandDto = return commandDto

}

Im obigen Fall erhalten Sie, wenn Sie statische Ressourcen anfordern:

{
    title: "Method Not Allowed",
    status: 405,
    detail: "Request method 'GET' not supported",
    path: "/index.html"
}

Der Grund dafür könnte sein, dass Sie eine Zuordnung vornehmen wollten @PostMapping, /fooaber die @RequestMappingAnmerkungen auf der @RestControllerEbene vergessen haben. In diesem Fall werden alle Anforderungen zugeordnet, POSTund in diesem Fall erhalten Sie keinen statischen Inhalt.


0

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:

@Configuration
public class StaticResourcesConfigurer implements WebMvcConfigurer {
    public void addResourceHandlers(final ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/**").addResourceLocations("classpath:/resources/static/");
    }
}

0

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):

<resources>
    <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
        <excludes>
            <exclude>static/aui/fonts/**</exclude>
        </excludes>
    </resource>
    <resource>
        <directory>src/main/resources</directory>
        <filtering>false</filtering>
        <includes>
            <include>static/aui/fonts/**</include>
        </includes>
    </resource>
</resources>

----- Alte Lösung (funktioniert, beschädigt aber einige Schriftarten) -----

Eine andere Lösung bestand darin, die Übereinstimmung von Suffixmustern mit zu deaktivieren setUseSuffixPatternMatch(false)

@Configuration
public class StaticResourceConfig implements WebMvcConfigurer {
    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        // disable suffix matching to serve .woff, images, etc.
        configurer.setUseSuffixPatternMatch(false);
    }
}

Credits: @Abhiji hat mich mit 4. in die richtige Richtung gelenkt!


0

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 ...

spring.resources.static-locations=classpath:/myresources/

Dadurch werden statische Standardspeicherorte überschrieben, die:

ResourceProperties.CLASSPATH_RESOURCE_LOCATIONS = { "classpath:/META-INF/resources/",
        "classpath:/resources/", "classpath:/static/", "classpath:/public/" };

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:

<host>/<context-path?if you have one>/example.html

Wenn ich eine andere URL wie <host>/<context-path>/magico/*für Dateien im Klassenpfad haben möchte : / magicofiles / *, brauchst du etwas mehr Konfiguration

@Configuration
class MyConfigClass implements WebMvcConfigurer

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/magico/**").addResourceLocations("/magicofiles/");
}

-1

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 bedeutet main/resourcesoder main/javadir.

Wenn sich Ihre Dateien nicht in Standardverzeichnissen befinden, können Sie die folgende Konfiguration hinzufügen:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers("/lib/**"); // like this
}

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        // ... etc.
}
...

}}

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.