Spring Boot ne fournit pas de contenu statique

Je me cogne la tête contre le mur pendant quelques heures maintenant. Mon projet est presque terminé, mais je ne peux pas le faire servir du contenu statique.

J’ai placé un dossier nommé static sous src/main/resources . A l’intérieur, j’ai un dossier nommé images . Lorsque je conditionne l’application et que je l’exécute, elle ne trouve pas les images que j’ai placées dans ce dossier.

J’ai essayé de mettre les fichiers statiques en public , les resources et les resources META-INF/resources mais rien ne fonctionne.

Si je jar -tvf app.jar je peux voir que les fichiers sont dans le fichier jar dans le bon dossier: /static/images/head.png par exemple, mais en appelant: http://localhost:8080/images/head.png , tout ce que je reçois est un 404

Des idées pourquoi Spring-Boot ne trouve pas cela? (J’utilise 1.1.4 BTW)

Ne pas ressusciter les morts après plus d’un an, mais toutes les réponses précédentes manquent des points cruciaux:

  1. @EnableWebMvc sur votre classe désactivera org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration . C’est bien si vous voulez un contrôle complet, mais sinon, c’est un problème.
  2. Il n’est pas nécessaire d’écrire du code pour append un autre emplacement pour les ressources statiques en plus de ce qui est déjà fourni. En regardant org.springframework.boot.autoconfigure.web.ResourceProperties partir de v1.3.0.RELEASE, je vois un champ staticLocations qui peut être configuré dans le staticLocations application.properties . Voici un extrait de la source:

     /** * Locations of static resources. Defaults to classpath:[/META-INF/resources/, * /resources/, /static/, /public/] plus context:/ (the root of the servlet context). */ private Ssortingng[] staticLocations = RESOURCE_LOCATIONS; 
  3. Comme mentionné précédemment, l’URL de la demande sera résolue par rapport à ces emplacements. Ainsi, src/main/resources/static/index.html sera servi lorsque l’URL de la requête est /index.html . La classe responsable de la résolution du chemin, à partir de Spring 4.1, est org.springframework.web.servlet.resource.PathResourceResolver .

  4. La correspondance de modèle de suffixe est activée par défaut, ce qui signifie que pour une URL de demande /index.html , Spring va rechercher les gestionnaires correspondant à /index.html . Ceci est un problème si l’intention est de servir du contenu statique. Pour désactiver cela, WebMvcConfigurerAdapter (mais n’utilisez pas @EnableWebMvc ) et remplacez configurePathMatch comme indiqué ci-dessous:

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

À mon humble avis, la seule façon d’avoir moins de bogues dans votre code est de ne pas écrire de code autant que possible. Utilisez ce qui est déjà fourni, même si cela nécessite des recherches, le retour en vaut la peine.

A la différence de ce que dit le boot de spring, pour que mon fichier JAR de spring serve le contenu: je devais append spécifiquement enregistrer mon contenu src / main / resources / static via cette classe de configuration:

 @Configuration public class StaticResourceConfiguration extends WebMvcConfigurerAdapter { private static final Ssortingng[] 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); } } 

J’ai eu un problème similaire, et il s’est avéré que la solution la plus simple consistait à faire en sorte que ma classe de configuration étende WebMvcAutoConfiguration :

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

Je n’avais besoin d’aucun autre code pour autoriser la diffusion de mon contenu statique. Cependant, j’ai placé un répertoire appelé public sous src/main/webapp et configuré maven pour pointer vers src/main/webapp tant que répertoire de ressources. Cela signifie que public est copié dans target/classes et se trouve donc dans le classpath au moment de l’exécution pour que spring-boot / tomcat le trouve.

Recherchez les contrôleurs mappés sur “/” ou sans chemin mappé.

J’ai eu un problème comme celui-ci, en obtenant 405 erreurs et je me suis cogné la tête pendant des jours. Le problème s’est avéré être un @RestController annoté @RestController que j’avais oublié d’annoter avec une annotation @RequestMapping . Je suppose que ce chemin mappé a été défini par défaut sur “/” et a bloqué le mappage des ressources de contenu statique.

La configuration peut être faite comme suit:

 @Configuration @EnableWebMvc public class WebMvcConfig extends WebMvcAutoConfigurationAdapter { // specific project configuration } 

Il est important de noter que votre WebMvcConfig peut remplacer la méthode addResourceHandlers et que vous devez donc appeler explicitement super.addResourceHandlers(registry) (il est vrai que si vous êtes satisfait des emplacements de ressources par défaut, vous n’avez pas besoin de remplacer une méthode).

Une autre chose à commenter ici est que ces emplacements de ressources par défaut ( /static , /public , /resources et /META-INF/resources ) seront enregistrés uniquement s’il n’y a pas déjà un gestionnaire de ressources mappé sur /** .

À partir de ce moment, si vous avez par exemple une image sur src/main/resources/static/images nommée image.jpg , vous pouvez y accéder à l’adresse suivante: http://localhost:8080/images/image.jpg ( étant le serveur démarré sur le port 8080 et l’application déployée dans le contexte racine).

Avez-vous consulté les documents de référence Spring Boot ?

Par défaut, Spring Boot servira le contenu statique d’un dossier appelé /static (ou /public ou /resources ou /META-INF/resources ) dans le chemin de classe ou à partir de la racine du ServletContext.

Vous pouvez également comparer votre projet avec le guide Serving Web Content with Spring MVC ou consulter le code source du projet spring-boot-sample-web-ui .

Cette solution fonctionne pour moi:

Tout d’abord, placez un dossier de ressources sous webapp / WEB-INF, comme suit:

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

Deuxièmement, dans le fichier de configuration de spring

 @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/"); } } 

Ensuite, vous pouvez accéder au contenu de votre ressource, tel que http: // localhost: 8080 / resource / image / yourimage.jpg

J’avais ce problème exact, puis réalisé que j’avais défini dans mon application.properties:

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

Ce qui dominait tout ce que j’avais essayé. Dans mon cas, je voulais garder les deux, alors j’ai juste gardé la propriété et ajouté:

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

Quels fichiers servis de src / main / resources / static comme localhost: {port} /file.html.

Rien de ce qui précède n’a fonctionné pour moi, car personne n’a mentionné cette petite propriété qui aurait facilement pu être copiée en ligne pour servir un objective différent;)

J’espère que cela aide! Figuré qu’il conviendrait bien dans ce long post de réponses pour les personnes ayant ce problème.

Je pense que les réponses précédentes abordent très bien le sujet. Cependant, j’appendais que dans un cas où Spring Security est activé dans votre application, vous devrez peut-être indiquer spécifiquement à Spring d’autoriser les requêtes vers d’autres répertoires de ressources statiques, comme par exemple “/ static / fonts” .

Dans mon cas, j’avais “/ static / css”, “/ static / js”, “/ static / images” autorisé par défaut, mais / static / fonts / ** était bloqué par mon implémentation de Spring Security.

Voici un exemple de la façon dont j’ai résolu ce problème.

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

Il y a 2 choses à considérer (Spring Boot v1.5.2.RELEASE) – 1) Vérifiez toutes les classes de contrôleur pour l’annotation @EnableWebMvc, supprimez-la s’il y en a 2) Vérifiez les classes de contrôleur pour lesquelles l’annotation est utilisée – @RestController ou @Controller . Ne mélangez pas l’API Rest et le comportement MVC dans une classe. Pour MVC, utilisez @Controller et pour l’API REST utilisez @RestController

Faire plus de 2 choses a résolu mon problème. Maintenant, mon démarrage au spring charge des ressources statiques sans aucun problème. @Controller => load index.html => charge les fichiers statiques.

 @Controller public class WelcomeController { // inject via application.properties @Value("${welcome.message:Hello}") private Ssortingng message = "Hello World"; @RequestMapping("/") public Ssortingng home(Map model) { model.put("message", this.message); return "index"; } } index.html    index            

Si le problème se pose lors du lancement de l’application depuis un IDE (à partir d’Eclipse ou d’IntelliJ Idea) et de Maven, la clé de la solution se trouve dans la documentation de démarrage de Spring-boot :

Si vous utilisez Maven, exécutez:

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

La partie importante de ce processus consiste à append l’objective du package à exécuter avant le démarrage effectif de l’application. (Idée: menu Run , Edit Configrations... , Add , puis sélectionnez Run Maven Goal et spécifiez l’objective du package dans le champ).

Juste pour append une autre réponse à une ancienne question … Les gens ont mentionné que @EnableWebMvc empêcherait le chargement de WebMvcAutoConfiguration , qui est le code responsable de la création des gestionnaires de ressources statiques. Il existe d’autres conditions qui empêchent le chargement de WebMvcAutoConfiguration . La façon la plus simple de voir cela est de regarder la source:

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

Dans mon cas, WebMvcConfigurationSupport une bibliothèque dont la classe s’étendait de WebMvcConfigurationSupport une condition qui empêchera la configuration automatique:

 @ConditionalOnMissingBean(WebMvcConfigurationSupport.class) 

Il est important de ne jamais étendre de WebMvcConfigurationSupport . À la place, WebMvcConfigurerAdapter partir de WebMvcConfigurerAdapter .

Eu le même problème, en utilisant gradle et eclipse et passé des heures à essayer de le comprendre.

Aucun codage requirejs, le problème est que vous devez utiliser l’option de menu New-> Dossier source (NOT New -> Folder) pour créer le dossier statique sous src / main / resources. Je ne sais pas pourquoi cela fonctionne, mais nouveau -> dossier source alors j’ai nommé le dossier statique (alors la boîte de dialog du dossier source donne une erreur pour laquelle vous devez vérifier: Mettre à jour les filtres d’exclusion dans d’autres dossiers sources pour résoudre l’imbrication). Le nouveau dossier statique auquel j’ai ajouté index.html et maintenant ça marche.

J’utilise 1.3.5 et héberge un tas de services REST via l’implémentation de Jersey. Cela a bien fonctionné jusqu’à ce que je décide d’append quelques fichiers HTML + js. Aucune des réponses données sur ce forum ne m’a aidé. Cependant, lorsque j’ai ajouté la dépendance suivante dans mon fichier pom.xml, tout le contenu de src / main / resources / static était finalement affiché via un navigateur:

  org.springframework.boot spring-boot-starter-web  

Il semble que Spring-web / spring-webmvc est la dépendance transitive importante qui active la configuration automatique du démarrage au spring.

Il est parfois utile de vérifier si vous avez remplacé les mappages globaux par un contrôleur de repos. Exemple simple erreur (kotlin):

 @RestController("/foo") class TrainingController { @PostMapping fun bazz(@RequestBody newBody: CommandDto): CommandDto = return commandDto } 

Dans le cas ci-dessus, vous obtiendrez lorsque vous demanderez des ressources statiques:

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

La raison en est peut-être que vous vouliez mapper @PostMapping vers /foo mais oubliez l’annotation @RestController niveau de @RestController . Dans ce cas, toutes les requêtes sont mappées sur POST et vous ne recevrez pas de contenu statique dans ce cas.

Par défaut, Spring Boot sert des ressources statiques définies sous les chemins suivants:

  • / META-INF / ressources /
  • /Ressources/
  • /statique/
  • /Publique/

Pour modifier les chemins par défaut des ressources statiques, vous pouvez définir l’ atsortingbut «spring.resources.static-locations» sous application.properties comme suit:

 spring.resources.static-locations=/html/,/js/,/css/ 

Dans votre cas, vous utilisez les chemins par défaut lus par Spring Boot, vous ne devriez pas obtenir 404 lors de l’access / images / sauf si vous avez explicitement défini un chemin de contexte différent pour votre application ou si vous avez activé @EnableWebMvc .

Pour plus d’informations sur le service et le chargement de ressources statiques dans l’application Spring Boot, cochez cette case : Servir des ressources statiques avec Spring Boot

Je suis dans la même situation où mon application angular d’amorçage (intégration) ne sert pas de contenu de dossier statique pour afficher l’interface utilisateur sur localhost: 8080. Frontend est développé en angular4, si bien que ng build généré des fichiers dans le chemin de sortie dir src / main / resources / static mais n’affiche aucun contenu. J’ai créé un contrôleur spécialement conçu pour servir index.html, mais il semble que quelque chose ne fonctionne pas pour que print-boot comprenne le routage angular et localhost: 8080 affiche simplement la chaîne renvoyée par la méthode “index.html” sur la page Web. Ci-dessous se trouve index.html (j’ai changé l’étiquette de sélection par défaut dans le corps en tant que composant de connexion est celui que j’ai créé et mon composant angular principal pour l’interface utilisateur mais ne fonctionne toujours pas si app-root ou celui-ci):

     Hello Test App         

Code du contrôleur:

 @RequestMapping("/") public Ssortingng userInterface() { return "index.html"; } 

Je ne suis pas sûr que ce soit important, mais ce projet est basé sur le développement et développé dans IntellijIdea et la version de démarrage du spring est – org.springframework.boot:spring-boot-starter-web:2.0.2.RELEASE .

Comme indiqué ci-dessus, le fichier devrait être dans $ClassPath/static/images/name.png , (/ static ou / public ou / resources ou / META-INF / resources). Ce $ ClassPath signifie main/resources ou main/java dir.

Si vos fichiers ne sont pas dans les répertoires standard, vous pouvez append la configuration suivante:

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

}