Java Spring Boot: Come mappare la mia root dell'app (“/”) su index.html?


134

Sono nuovo di Java e di Spring. Come posso mappare la mia root dell'app http://localhost:8080/su una statica index.html? Se navigo verso le http://localhost:8080/index.htmlsue opere va bene.

La mia struttura dell'app è:

dirs

Il mio config\WebConfig.javaassomiglia a questo:

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

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

Ho provato ad aggiungere registry.addResourceHandler("/").addResourceLocations("/index.html");ma non ci riesce.



3
@UdoKlimaschewski Mostra come mappare http://localhost:8080/appNamema non è quello di cui ho bisogno ...
— Shoham,

1
WebMvcConfigurerAdapter è obsoleto
— user1346730

Risposte:


150

Sarebbe andato fuori dagli schemi se non avessi usato l' @EnableWebMvcannotazione. Quando lo fai, spegni tutte le cose che Spring Boot fa per te WebMvcAutoConfiguration. È possibile rimuovere tale annotazione oppure aggiungere nuovamente il controller di visualizzazione disattivato:

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

1
Grazie .. Non ho capito che ... non riusciva a trovare un semplice demo nel loro sito che mostra che ...
— Shoham

12
Dai documenti di riferimento : "Se vuoi mantenere le funzionalità Spring Boot MVC e vuoi solo aggiungere una configurazione MVC aggiuntiva (intercettori, formattatori, controller di visualizzazione ecc.) Puoi aggiungere il tuo @Bean di tipo WebMvcConfigurerAdapter, ma senza @EnableWebMvc"
— Dave Syer il

1
Questo servirà index.htmla /. Ma è anche possibile fare in modo che il browser cambi effettivamente l'URL da /a /index.html?
— asmaier,

13
Ok l'ho capito. Nel caso in cui anche voi volete cambiare l'URL da /a /index.htmluso "redirect:/index.html" invece che in avanti.
— asmaier,

4
Non sto usando l'annotazione @EnableWebMvc e non vengo reindirizzato a index.html.
— Jelle,

44

Un esempio della risposta di 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");
            }
        };
    }

}

8
Usa WebMvcConfigurer invece di WebMvcConfigurerAdapter obsoleto nella primavera 5.
— Moose on the Loose

22

se si tratta di un'app di avvio Spring.

Spring Boot rileva automaticamente index.html nella cartella public / static / webapp. Se hai scritto un controller, @Requestmapping("/")questo sovrascriverà la funzione predefinita e non mostrerà il index.htmlmeno che non digitilocalhost:8080/index.html


4
Ho creato un file src / main / resources / public / index.html e ha funzionato! Grazie
— James Watkins il

È ancora vero?
— FearX

10
@Configuration  
@EnableWebMvc  
public class WebAppConfig extends WebMvcConfigurerAdapter {  

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

}

8

Aggiornamento: gennaio-2019

Innanzitutto crea una cartella pubblica sotto le risorse e crea il file index.html. Utilizzare WebMvcConfigurer anziché 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");
    }

}

cosa potrebbe esserci di sbagliato se questo non funziona? resources / public / index.html esiste; java 13; primavera 2.2.2; tomcat
— JFFIGK il

7

Se usi l'ultima versione spring-boot 2.1.6.RELEASEcon una semplice @RestControllerannotazione, non devi fare nulla, aggiungi il tuo index.htmlfile nella resources/staticcartella:

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

Quindi premi l'URL http: // localhost: 8080 . Spero che possa aiutare tutti.


nel mio caso, funzionava ma quando sono passato da Tomcat a Undertow improvvisamente ho smesso di funzionare. ora ho bisogno di un modo per inoltrare / al mio index.html
— Faller tedesco

5

All'interno Spring Boot, inserisco sempre le pagine Web in una cartella come publicowebapps o viewse le inserisco all'interno della src/main/resourcesdirectory, come puoi vedere application.propertiesanche in.

Spring_Boot-Project-Explorer-View

e questo è il mio 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

non appena si inserisce l'URL come servername:15800e questa richiesta ricevuta dal dispatcher di servlet occupati da Spring Boot cercherà esattamente il index.htmle questo nome sarà sensibile al maiuscolo / minuscolo comespring.mvc.view.suffix che sarebbe html, jsp, htm ecc.

Spero che possa aiutare molti.


@ArifMustafa Nelle recenti versioni di Sprint Boot, raccomando di inserire anche le pagine Web all'interno dei modelli.
— ArifMustafa,

Hai riferimenti per questo? Sto cercando di creare un progetto frontend di reazione / redux con un backend di Spring e non sono sicuro delle migliori pratiche coinvolte.
— mike,

2
  1. Il file index.html dovrebbe trovarsi sotto la posizione - src / resources / public / index.html OPPURE src / resources / static / index.html se entrambe le posizioni definite, che si verifica per prima cosa index.html chiamerà da quella directory.
  2. Il codice sorgente sembra:

    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);
       }
    }

1

Ho avuto lo stesso problema. L'avvio a molla sa dove si trovano i file html statici.

  1. Aggiungi index.html nella cartella risorse / statica
  2. Quindi eliminare il metodo controller completo per il percorso radice come @RequestMapping ("/") ecc
  3. Esegui l'app e controlla http: // localhost: 8080 (dovrebbe funzionare)

0

Puoi aggiungere un RedirectViewController come:

@Configuration
public class WebConfiguration implements WebMvcConfigurer {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addRedirectViewController("/", "/index.html");
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.