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.