Java Spring Boot: Comment mapper la racine de mon application («/») à index.html?

134

Je suis nouveau sur Java et Spring. Comment puis-je mapper la racine http://localhost:8080/de mon application à un statique index.html? Si je navigue vers http://localhost:8080/index.htmlses travaux bien.

La structure de mon application est:

dirs

Mon config\WebConfig.javaressemble à ceci:

@Configuration
@EnableWebMvc
@ComponentScan
public class WebConfig extends WebMvcConfigurerAdapter {

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

J'ai essayé d'ajouter registry.addResourceHandler("/").addResourceLocations("/index.html");mais cela échoue.

Shoham
la source
1
Peut-être que cela aide: stackoverflow.com/questions/20405474/spring-boot-context-root
Udo Klimaschewski
3
@UdoKlimaschewski Il montre comment cartographier http://localhost:8080/appNamemais ce n'est pas ce dont j'ai besoin ...
Shoham
1
WebMvcConfigurerAdapter est obsolète
user1346730

Réponses:

150

Cela aurait fonctionné hors de la boîte si vous n'aviez pas utilisé d' @EnableWebMvcannotation. Lorsque vous faites cela, vous désactivez tout ce que Spring Boot fait pour vous WebMvcAutoConfiguration. Vous pouvez supprimer cette annotation ou rajouter le contrôleur de vue que vous avez désactivé:

@Override
public void addViewControllers(ViewControllerRegistry registry) {
    registry.addViewController("/").setViewName("forward:/index.html");
}
Dave Syer
la source
1
Merci .. Je n'ai pas réalisé que ... je n'ai pas pu trouver une démo simple sur leur site qui montre que ...
Shoham
12
À partir de la documentation de référence : "Si vous souhaitez conserver les fonctionnalités de Spring Boot MVC et que vous souhaitez simplement ajouter une configuration MVC supplémentaire (intercepteurs, formateurs, contrôleurs de vue, etc.), vous pouvez ajouter votre propre @Bean de type WebMvcConfigurerAdapter, mais sans @EnableWebMvc"
Dave Syer
1
Cela servira index.htmlà /. Mais est-il possible de faire en sorte que le navigateur change réellement l'URL de /à /index.html?
asmaier
13
Ok, je l'ai compris. Si vous souhaitez également modifier l'URL de /à /index.htmlutiliser "redirect:/index.html" au lieu de transférer.
asmaier
4
Je n'utilise pas l'annotation @EnableWebMvc et je ne suis pas redirigé vers index.html.
Jelle
44

Un exemple de la réponse de Dave Syer:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
public class MyWebMvcConfig {

    @Bean
    public WebMvcConfigurerAdapter forwardToIndex() {
        return new WebMvcConfigurerAdapter() {
            @Override
            public void addViewControllers(ViewControllerRegistry registry) {
                // forward requests to /admin and /user to their index.html
                registry.addViewController("/admin").setViewName(
                        "forward:/admin/index.html");
                registry.addViewController("/user").setViewName(
                        "forward:/user/index.html");
            }
        };
    }

}
Justin
la source
8
Utilisez WebMvcConfigurer au lieu de WebMvcConfigurerAdapter obsolète au printemps 5.
Moose on the Loose
22

s'il s'agit d'une application Spring Boot.

Spring Boot détecte automatiquement index.html dans le dossier public / static / webapp. Si vous avez écrit un contrôleur, @Requestmapping("/")il remplacera la fonction par défaut et ne montrera pas le index.htmlsauf si vous tapezlocalhost:8080/index.html

Krish
la source
4
J'ai créé un fichier src / main / resources / public / index.html et cela a fonctionné! Merci
James Watkins
Est-ce toujours vrai?
FearX
10
@Configuration  
@EnableWebMvc  
public class WebAppConfig extends WebMvcConfigurerAdapter {  

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addRedirectViewController("/", "index.html");
    }

}
Rodrigo Ribeiro
la source
8

Mise à jour: janvier-2019

Créez d'abord un dossier public sous ressources et créez un fichier index.html. Utilisez WebMvcConfigurer au lieu de WebMvcConfigurerAdapter.

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebAppConfig implements WebMvcConfigurer {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("forward:/index.html");
    }

}
Sampath T
la source
qu'est-ce qui pourrait être mal si cela ne fonctionne pas? resources / public / index.html existe; java 13; ressort 2.2.2; tomcat
JFFIGK
7

Si vous utilisez la dernière spring-boot 2.1.6.RELEASEavec une simple @RestControllerannotation, vous n'avez rien à faire, ajoutez simplement votre index.htmlfichier sous le resources/staticdossier:

project
  ├── src
      ├── main
          └── resources
              └── static
                  └── index.html

Ensuite, appuyez sur l'URL http: // localhost: 8080 . J'espère que cela aidera tout le monde.

zappee
la source
dans mon cas, cela fonctionnait, mais quand je suis passé de Tomcat à Undertow, j'ai soudainement cessé de fonctionner. maintenant j'ai besoin d'un moyen de transférer / vers mon index.html
German Faller
5

À l'intérieur Spring Boot, je mets toujours les pages Web dans un dossier comme publicou webappsou viewset je le place dans le src/main/resourcesrépertoire comme vous pouvez le voir application.propertieségalement.

Spring_Boot-Project-Explorer-View

et voici mon application.properties:

server.port=15800
spring.mvc.view.prefix=/public/
spring.mvc.view.suffix=.html
spring.datasource.url=jdbc:mysql://localhost:3306/hibernatedb
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.hibernate.ddl-auto = update
spring.jpa.properties.hibernate.format_sql = true

logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE

dès que vous mettez l'url comme servername:15800et cette demande reçue par le répartiteur de servlet occupé par Spring Boot, il recherchera exactement le index.htmlet ce nom sera sensible à la casse comme celui spring.mvc.view.suffixqui serait html, jsp, htm etc.

J'espère que cela aiderait beaucoup de monde.

ArifMustafa
la source
@ArifMustafa Dans les versions récentes de Sprint Boot, je recommande également de mettre des pages Web dans des modèles.
ArifMustafa
Avez-vous des références pour cela? J'essaie de créer un projet frontend react / redux avec un backend Spring et je ne suis pas sûr des meilleures pratiques impliquées.
mike
2
  1. Le fichier index.html doit se trouver sous l'emplacement ci-dessous - src / resources / public / index.html OU src / resources / static / index.html si les deux emplacements sont définis, alors quel premier se produira index.html appellera à partir de ce répertoire.
  2. Le code source ressemble à -

    package com.bluestone.pms.app.boot; 
    import org.springframework.boot.Banner;
    import org.springframework.boot.Banner;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.builder.SpringApplicationBuilder;
    import org.springframework.boot.web.support.SpringBootServletInitializer;
    import org.springframework.context.annotation.ComponentScan;
    
    
    
    @SpringBootApplication 
    @EnableAutoConfiguration
    @ComponentScan(basePackages = {"com.your.pkg"}) 
    public class BootApplication extends SpringBootServletInitializer {
    
    
    
    /**
     * @param args Arguments
    */
    public static void main(String[] args) {
    SpringApplication application = new SpringApplication(BootApplication.class);
    /* Setting Boot banner off default value is true */
    application.setBannerMode(Banner.Mode.OFF);
    application.run(args);
    }
    
    /**
      * @param builder a builder for the application context
      * @return the application builder
      * @see SpringApplicationBuilder
     */
     @Override
     protected SpringApplicationBuilder configure(SpringApplicationBuilder 
      builder) {
        return super.configure(builder);
       }
    }
Pravind Kumar
la source
1

J'ai eu le même problème. Spring Boot sait où se trouvent les fichiers html statiques.

  1. Ajouter index.html dans le dossier resources / static
  2. Puis supprimez la méthode du contrôleur complet pour le chemin racine comme @RequestMapping ("/") etc
  3. Exécutez l'application et vérifiez http: // localhost: 8080 (devrait fonctionner)
Yuriy Kiselev
la source
0

Vous pouvez ajouter un RedirectViewController comme:

@Configuration
public class WebConfiguration implements WebMvcConfigurer {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addRedirectViewController("/", "/index.html");
    }
}
Neeraj Gahlawat
la source