Java Spring Boot: como mapear a raiz do meu aplicativo (“/”) para index.html?

133

Eu sou novo em Java e Spring. Como posso mapear a raiz do meu aplicativo http://localhost:8080/para uma estática index.html? Se eu navegar para as http://localhost:8080/index.htmlsuas obras bem.

Minha estrutura de aplicativos é:

dirs

Minha config\WebConfig.javaaparência é assim:

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

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

Eu tentei adicionar, registry.addResourceHandler("/").addResourceLocations("/index.html");mas ele falhou.

Shoham
fonte
1
Talvez isso ajude: stackoverflow.com/questions/20405474/spring-boot-context-root
Udo Klimaschewski
3
@UdoKlimaschewski ele mostra como mapear http://localhost:8080/appNamemas não é o que eu preciso ...
Shoham
1
O WebMvcConfigurerAdapter está obsoleto
user1346730

Respostas:

150

Teria funcionado imediatamente se você não tivesse usado a @EnableWebMvcanotação. Quando você faz isso, desativa todas as coisas que o Spring Boot faz por você WebMvcAutoConfiguration. Você pode remover essa anotação ou adicionar novamente o controlador de exibição que desativou:

@Override
public void addViewControllers(ViewControllerRegistry registry) {
    registry.addViewController("/").setViewName("forward:/index.html");
}
Dave Syer
fonte
1
Thanks .. Eu não percebi que ... não poderia encontrar um simples demo em seu site que mostra que ...
Shoham
12
Nos documentos de referência : "Se você deseja manter os recursos do Spring Boot MVC e deseja adicionar configurações adicionais do MVC (interceptores, formatadores, controladores de exibição etc.), você pode adicionar seu próprio @Bean do tipo WebMvcConfigurerAdapter, mas sem @EnableWebMvc"
Dave Syer
1
Isso servirá index.htmlàs /. Mas é possível também fazer com que o navegador realmente altere o URL de /para /index.html?
Asmaier 15/05
12
Ok, eu descobri. Caso você também queira alterar o URL de /para /index.htmlusar em "redirect:/index.html" vez de para frente.
Asmaier 15/05
4
Não estou usando a anotação @EnableWebMvc e não sou redirecionado para index.html.
Jelle
44

Um exemplo da resposta 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
fonte
8
Use WebMvcConfigurer vez de WebMvcConfigurerAdapter deprecated in Spring 5.
Moose on the Loose
22

se for um aplicativo de inicialização do Spring.

O Spring Boot detecta automaticamente index.html na pasta public / static / webapp. Se você escreveu algum controlador, @Requestmapping("/")ele substituirá o recurso padrão e não exibirá o mesmo, a index.htmlmenos que você digitelocalhost:8080/index.html

Krish
fonte
4
Criei um arquivo src / main / resources / public / index.html e funcionou! Obrigado
James Watkins
Isso ainda é verdade?
FearX 14/11/19
10
@Configuration  
@EnableWebMvc  
public class WebAppConfig extends WebMvcConfigurerAdapter {  

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

}
Rodrigo Ribeiro
fonte
8

Atualização: Jan-2019

Primeiro, crie uma pasta pública em recursos e crie o arquivo index.html. Use WebMvcConfigurer em vez 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
fonte
o que poderia estar errado se isso não funcionar? resources / public / index.html existe; java 13; primavera 2.2.2; tomcat
JFFIGK
7

Se você usar o mais recente spring-boot 2.1.6.RELEASEcom uma @RestControlleranotação simples , não precisará fazer nada, basta adicionar seu index.htmlarquivo na resources/staticpasta:

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

Em seguida, clique no URL http: // localhost: 8080 . Espero que ajude a todos.

zappee
fonte
no meu caso, estava funcionando, mas quando mudei de tomcat para Undertow de repente parei de funcionar. agora eu preciso de uma maneira de encaminhar / para meu index.html
Faller alemão
5

Por dentro Spring Boot, eu sempre coloco as páginas da Web em uma pasta como publicou webappsou viewse as coloco dentro do src/main/resourcesdiretório, como você pode ver application.propertiestambém.

Spring_Boot-Project-Explorer-View

e este é o meu 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

assim que você colocar o URL como servername:15800e esta solicitação recebida pelo despachante do Servlet ocupado pelo Spring Boot, ele pesquisará exatamente o index.htmle esse nome será sensível a maiúsculas, como o spring.mvc.view.suffixque seria html, jsp, htm etc.

Espero que ajude alguém.

ArifMustafa
fonte
@ArifMustafa Nas versões recentes do Sprint Boot, eu recomendo colocar páginas da Web dentro dos modelos também.
ArifMustafa 29/04
Você tem referências para isso? Estou tentando criar um projeto de front-end de reagir / redux com um back-end do Spring e não tenho certeza sobre as melhores práticas envolvidas.
Mike
2
  1. O arquivo index.html deve estar abaixo do local - src / resources / public / index.html OR src / resources / static / index.html se os dois locais definidos, e o que ocorrer primeiro, index.html chamará desse diretório.
  2. O código fonte se parece com -

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

Eu tive o mesmo problema. A inicialização do Spring sabe onde estão os arquivos estáticos html.

  1. Adicione index.html na pasta resources / static
  2. Em seguida, exclua o método do controlador completo para o caminho raiz, como @RequestMapping ("/") etc
  3. Execute o aplicativo e verifique http: // localhost: 8080 (deve funcionar)
Yuriy Kiselev
fonte
0

Você pode adicionar um RedirectViewController como:

@Configuration
public class WebConfiguration implements WebMvcConfigurer {

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