Java Spring Boot: как сопоставить корень моего приложения («/») с index.html?

134

Я новичок в Java и Spring. Как я могу сопоставить корень моего приложения http://localhost:8080/со статикой index.html? Если я перейду к нему, http://localhost:8080/index.htmlон работает нормально.

Моя структура приложения:

каталоги

Моя config\WebConfig.javaвыглядит так:

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

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

Я пытался добавить, registry.addResourceHandler("/").addResourceLocations("/index.html");но не получилось.

Shoham
источник
1
Может быть, это поможет: stackoverflow.com/questions/20405474/spring-boot-context-root
Удо Климашевски,
3
@UdoKlimaschewski Он показывает, как составить карту, http://localhost:8080/appNameно это не то, что мне нужно ...
Шохам
1
WebMvcConfigurerAdapter устарел
user1346730

Ответы:

150

Если бы вы не использовали @EnableWebMvcаннотацию, это бы сработало из коробки . Когда вы это делаете, вы отключаете все, что Spring Boot делает за вас WebMvcAutoConfiguration. Вы можете удалить эту аннотацию или добавить обратно отключенный контроллер представления:

@Override
public void addViewControllers(ViewControllerRegistry registry) {
    registry.addViewController("/").setViewName("forward:/index.html");
}
Дейв Сайер
источник
1
Спасибо .. Я не понял этого ... не смог найти на их сайте ни одной простой демонстрации, которая показывает это ...
Шохам
12
Из справочной документации : «Если вы хотите сохранить функции Spring Boot MVC и просто хотите добавить дополнительную конфигурацию MVC (перехватчики, средства форматирования, контроллеры представления и т. Д.), Вы можете добавить свой собственный @Bean типа WebMvcConfigurerAdapter, но без @EnableWebMvc»
Дэйв Сайер
1
Это будет служить index.htmlв /. Но можно ли сделать так, чтобы браузер действительно изменил URL-адрес с /на /index.html?
asmaier
13
Хорошо, я понял это. Если вы также хотите изменить URL-адрес /на /index.htmlиспользование "redirect:/index.html" вместо пересылки.
asmaier
4
Я не использую аннотацию @EnableWebMvc, и меня не перенаправляют на index.html.
Jelle
44

Пример ответа Дэйва Сайера:

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
Используйте WebMvcConfigurer вместо устаревшего WebMvcConfigurerAdapter в Spring 5.
Moose on the Loose
22

если это приложение для загрузки Spring.

Spring Boot автоматически обнаруживает index.html в папке public / static / webapp. Если вы написали какой-либо контроллер, @Requestmapping("/")он переопределит функцию по умолчанию и не будет отображать, index.htmlесли вы не введетеlocalhost:8080/index.html

Криш
источник
4
Я создал файл src / main / resources / public / index.html, и он сработал! Спасибо
Джеймс Уоткинс
Это все еще правда?
FearX
10
@Configuration  
@EnableWebMvc  
public class WebAppConfig extends WebMvcConfigurerAdapter {  

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

}
Родриго Рибейро
источник
8

Обновление: январь-2019

Сначала создайте общую папку под ресурсами и создайте файл index.html. Используйте WebMvcConfigurer вместо 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");
    }

}
Сампат Т
источник
что может быть не так, если это не работает? ресурсы / public / index.html существует; java 13; пружина 2.2.2; tomcat
JFFIGK
7

Если вы используете последнюю версию spring-boot 2.1.6.RELEASEс простой @RestControllerаннотацией, вам не нужно ничего делать, просто добавьте свой index.htmlфайл в resources/staticпапку:

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

Затем нажмите URL-адрес http: // localhost: 8080 . Надеюсь, что это поможет всем.

zappee
источник
в моем случае это работало, но когда я перешел с tomcat на Undertow, он внезапно перестал работать. теперь мне нужен способ пересылки / на мой index.html
Фаллер из Германии
5

Внутри Spring Bootя всегда помещаю веб-страницы в папку типа publicили webappsили viewsи помещаю их в src/main/resourcesкаталог, как вы можете видеть application.propertiesтакже.

Spring_Boot-Project-Explorer-View

и это мое 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

как только вы введете URL-адрес, servername:15800и этот запрос, полученный Spring Boot, занял диспетчер Servlet, он будет точно выполнять поиск, index.htmlи это имя будет чувствительным к регистру, таким как spring.mvc.view.suffixhtml, jsp, htm и т. д.

Надеюсь, это поможет многим.

ArifMustafa
источник
@ArifMustafa В последних версиях Sprint Boot я также рекомендую помещать веб-страницы в шаблоны.
ArifMustafa
У вас есть ссылки на это? Я пытаюсь создать проект интерфейса response / redux с бэкэндом Spring, и я не уверен в используемых передовых методах.
Майк
2
  1. Файл index.html должен находиться в расположении ниже - src / resources / public / index.html ИЛИ src / resources / static / index.html, если оба местоположения определены, то первое, что происходит, index.html будет вызывать из этого каталога.
  2. Исходный код выглядит так -

    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

У меня такая же проблема. Spring boot знает, где находятся статические html-файлы.

  1. Добавьте index.html в папку resources / static
  2. Затем удалите полный метод контроллера для корневого пути, например @RequestMapping ("/") и т. Д.
  3. Запустите приложение и проверьте http: // localhost: 8080 (должно работать)
Юрий Киселев
источник
0

Вы можете добавить RedirectViewController как:

@Configuration
public class WebConfiguration implements WebMvcConfigurer {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addRedirectViewController("/", "/index.html");
    }
}
Нирадж Гахлават
источник