Java Spring Boot: ¿Cómo asignar la raíz de mi aplicación ("/") a index.html?

133

Soy nuevo en Java y Spring. ¿Cómo puedo asignar la raíz de mi aplicación http://localhost:8080/a una estática index.html? Si navego a http://localhost:8080/index.htmlsu funciona bien.

La estructura de mi aplicación es:

dirs

Mi config\WebConfig.javaaspecto es este:

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

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

Traté de agregar registry.addResourceHandler("/").addResourceLocations("/index.html");pero falla.

Shoham
fuente
1
Tal vez esto ayude: stackoverflow.com/questions/20405474/spring-boot-context-root
Udo Klimaschewski
3
@UdoKlimaschewski Muestra cómo mapear http://localhost:8080/appNamepero no es lo que necesito ...
Shoham
1
WebMvcConfigurerAdapter está en desuso
user1346730

Respuestas:

150

Hubiera salido de la caja si no hubieras usado @EnableWebMvcanotaciones. Cuando haces eso, apagas todas las cosas que Spring Boot hace por ti WebMvcAutoConfiguration. Puede eliminar esa anotación, o puede volver a agregar el controlador de vista que apagó:

@Override
public void addViewControllers(ViewControllerRegistry registry) {
    registry.addViewController("/").setViewName("forward:/index.html");
}
Dave Syer
fuente
1
Gracias ... No me di cuenta de que ... no pude encontrar una demostración simple en su sitio que muestre que ...
Shoham
12
De los documentos de referencia : "Si desea mantener las funciones de Spring Boot MVC y solo desea agregar una configuración MVC adicional (interceptores, formateadores, controladores de vista, etc.), puede agregar su propio @Bean de tipo WebMvcConfigurerAdapter, pero sin @EnableWebMvc"
Dave Syer
1
Esto servirá index.htmla las /. Pero, ¿es posible hacer que el navegador realmente cambie la URL de /a /index.html?
asmaier
12
Ok, lo descubrí. En caso de que también quiere cambiar la url de /que /index.htmlsu uso "redirect:/index.html" en lugar de hacia adelante.
asmaier
44
No estoy usando la anotación @EnableWebMvc, y no me redirigen a index.html.
Jelle
44

Un ejemplo de la respuesta 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
fuente
8
Use WebMvcConfigurer en lugar de WebMvcConfigurerAdapter en desuso en la primavera 5.
Moose on the Loose
22

si es una aplicación de arranque Spring.

Spring Boot detecta automáticamente index.html en la carpeta public / static / webapp. Si ha escrito algún controlador @Requestmapping("/"), anulará la función predeterminada y no mostrará el a index.htmlmenos que escribalocalhost:8080/index.html

Krish
fuente
44
¡Creé un archivo src / main / resources / public / index.html y funcionó! Gracias
James Watkins el
¿Sigue siendo cierto?
FearX
10
@Configuration  
@EnableWebMvc  
public class WebAppConfig extends WebMvcConfigurerAdapter {  

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

}
Rodrigo Ribeiro
fuente
8

Actualización: enero-2019

Primero cree una carpeta pública en recursos y cree el archivo index.html. Utilice WebMvcConfigurer en lugar 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
fuente
¿Qué podría estar mal si esto no funciona? resources / public / index.html existe; Java 13; primavera 2.2.2; tomcat
JFFIGK
7

Si usa lo último spring-boot 2.1.6.RELEASEcon una @RestControlleranotación simple, entonces no necesita hacer nada, simplemente agregue su index.htmlarchivo en la resources/staticcarpeta:

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

Luego presione la URL http: // localhost: 8080 . Espero que ayude a todos.

zappee
fuente
en mi caso, estaba funcionando pero cuando cambié de tomcat a Undertow de repente dejé de funcionar. ahora necesito una forma de reenviar / a mi index.html
Faller alemán
5

En el interior Spring Boot, que siempre puso las páginas web dentro de una carpeta como publico webappso viewsy colocarlo dentro src/main/resourcesdel directorio como se puede ver en application.propertiestambién.

Spring_Boot-Project-Explorer-View

y este es mi 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

tan pronto como ponga la URL como servername:15800y esta solicitud recibida por el despachador de Servlet ocupado de Spring Boot, buscará exactamente index.htmly este nombre será sensible en caso de spring.mvc.view.suffixque sea html, jsp, htm, etc.

Espero que ayude a muchos.

ArifMustafa
fuente
@ArifMustafa En las últimas versiones de Sprint Boot, también recomiendo poner páginas web dentro de plantillas.
ArifMustafa
¿Tienes referencias para eso? Estoy tratando de crear un proyecto frontend react / redux con un backend de Spring y no estoy seguro de las mejores prácticas involucradas.
Mike
2
  1. El archivo index.html debe aparecer debajo de la ubicación: src / resources / public / index.html O src / resources / static / index.html si ambas ubicaciones están definidas, entonces, qué primero ocurrirá index.html llamará desde ese directorio.
  2. El código fuente se ve así:

    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
fuente
1

Yo tuve el mismo problema. Spring boot sabe dónde se encuentran los archivos html estáticos.

  1. Agregue index.html en la carpeta resources / static
  2. Luego, elimine el método de controlador completo para la ruta raíz como @RequestMapping ("/"), etc.
  3. Ejecute la aplicación y verifique http: // localhost: 8080 (debería funcionar)
Yuriy Kiselev
fuente
0

Puede agregar un RedirectViewController como:

@Configuration
public class WebConfiguration implements WebMvcConfigurer {

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