Java Spring Boot: Bagaimana memetakan root aplikasi saya ("/") ke index.html?

133

Saya baru di Jawa dan Musim Semi. Bagaimana saya bisa memetakan root aplikasi saya http://localhost:8080/ke statis index.html? Jika saya menavigasi ke http://localhost:8080/index.htmlberfungsi dengan baik.

Struktur aplikasi saya adalah:

dir

config\WebConfig.javaPenampilan saya seperti ini:

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

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

Saya mencoba menambahkan registry.addResourceHandler("/").addResourceLocations("/index.html");tetapi gagal.

Shoham
sumber
1
Mungkin ini membantu: stackoverflow.com/questions/20405474/spring-boot-context-root
Udo Klimaschewski
3
@UdoKlimaschewski Ini menunjukkan cara memetakan http://localhost:8080/appNametetapi bukan itu yang saya butuhkan ...
Shoham
1
WebMvcConfigurerAdapter sudah tidak digunakan lagi
user1346730

Jawaban:

150

Itu akan bekerja di luar kotak jika Anda tidak menggunakan @EnableWebMvcanotasi. Ketika Anda melakukan itu, Anda mematikan semua hal yang Spring Boot lakukan untuk Anda WebMvcAutoConfiguration. Anda bisa menghapus anotasi itu, atau Anda bisa menambahkan kembali pengontrol tampilan yang Anda matikan:

@Override
public void addViewControllers(ViewControllerRegistry registry) {
    registry.addViewController("/").setViewName("forward:/index.html");
}
Dave Syer
sumber
1
Terima kasih .. Saya tidak menyadari bahwa ... tidak dapat menemukan satu demo sederhana di situs mereka yang menunjukkan bahwa ...
Shoham
12
Dari dokumen referensi : "Jika Anda ingin mempertahankan fitur Spring Boot MVC, dan Anda hanya ingin menambahkan konfigurasi MVC tambahan (interceptors, formatters, view controllers etc.) Anda dapat menambahkan @Bean Anda sendiri dari tipe WebMvcConfigurerAdapter, tetapi tanpa @EnableWebMvc"
Dave Syer
1
Ini akan melayani index.htmldi /. Tetapi mungkinkah juga membuat peramban benar-benar mengubah url dari /menjadi /index.html?
asmaier
12
Oke, saya sudah menemukannya. Dalam kasus Anda juga ingin mengubah url dari /ke /index.htmlpenggunaan "redirect:/index.html" bukannya maju.
asmaier
4
Saya tidak menggunakan anotasi @EnableWebMvc, dan saya tidak diarahkan ke index.html.
Jelle
44

Contoh jawaban 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
sumber
8
Gunakan WebMvcConfigurer alih-alih WebMvcConfigurerAdapter yang sudah usang di Spring 5.
Moose on the Loose
22

jika itu adalah aplikasi boot Spring.

Spring Boot secara otomatis mendeteksi index.html di folder public / static / webapp. Jika Anda telah menulis kontroler apa pun, @Requestmapping("/")ia akan mengabaikan fitur default dan tidak akan menampilkan index.htmlkecuali Anda mengetiklocalhost:8080/index.html

Krish
sumber
4
Saya membuat file src / main / resources / public / index.html dan berhasil! Terima kasih
James Watkins
Apakah itu masih benar?
FearX
10
@Configuration  
@EnableWebMvc  
public class WebAppConfig extends WebMvcConfigurerAdapter {  

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

}
Rodrigo Ribeiro
sumber
8

Pembaruan: Jan-2019

Pertama buat folder publik di bawah sumber daya dan buat file index.html. Gunakan WebMvcConfigurer alih-alih 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
sumber
apa yang bisa salah jika ini tidak berhasil? sumber daya / publik / index.html ada; java 13; musim semi 2.2.2; tomcat
JFFIGK
7

Jika Anda menggunakan yang terbaru spring-boot 2.1.6.RELEASEdengan @RestControlleranotasi sederhana maka Anda tidak perlu melakukan apa pun, cukup tambahkan index.htmlfile Anda di bawah resources/staticfolder:

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

Kemudian tekan URL http: // localhost: 8080 . Semoga itu akan membantu semua orang.

Zappee
sumber
dalam kasus saya, itu berhasil tetapi ketika saya berubah dari tomcat ke Undertow tiba-tiba berhenti bekerja. sekarang saya perlu cara untuk meneruskan / ke index.html saya
Faller Jerman
5

Di dalam Spring Boot, saya selalu meletakkan halaman web di dalam folder like publicatau webappsatau viewsdan menempatkannya di dalam src/main/resourcesdirektori seperti yang Anda lihat application.propertiesjuga.

Spring_Boot-Project-Explorer-View

dan ini milik saya 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

segera setelah Anda meletakkan url like servername:15800dan permintaan ini diterima oleh Spring Boot yang ditempati operator Servlet itu akan mencari persis index.htmldan nama ini akan dalam hal sensitif sebagaispring.mvc.view.suffix yang akan menjadi html, jsp, htm dll.

Semoga ini bisa membantu orang lain.

ArifMustafa
sumber
@ArifMustafa Dalam versi Sprint Boot baru-baru ini, saya sarankan untuk meletakkan halaman web di dalam templat juga.
ArifMustafa
Apakah Anda punya referensi untuk itu? Saya mencoba untuk membuat proyek frontend reaksi / redux dengan backend Spring dan saya tidak yakin tentang praktik terbaik yang terlibat.
mike
2
  1. File index.html harusnya berada di bawah lokasi - src / resources / public / index.html ATAU src / resources / static / index.html jika kedua lokasi ditentukan maka yang pertama kali muncul index.html akan memanggil dari direktori tersebut.
  2. Kode sumbernya terlihat seperti -

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

Saya memiliki masalah yang sama. Spring boot tahu di mana file html statis berada.

  1. Tambahkan index.html ke folder resources / static
  2. Kemudian hapus metode pengontrol penuh untuk path root seperti @RequestMapping ("/") dll
  3. Jalankan aplikasi dan periksa http: // localhost: 8080 (Harus berfungsi)
Yuriy Kiselev
sumber
0

Anda dapat menambahkan RedirectViewController seperti:

@Configuration
public class WebConfiguration implements WebMvcConfigurer {

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