Java Spring Boot: Wie ordne ich mein App-Stammverzeichnis ("/") index.html zu?

133

Ich bin neu in Java und im Frühling. Wie kann ich mein App-Stammverzeichnis http://localhost:8080/einer statischen index.htmlDatei zuordnen ? Wenn ich zu ihm navigiere, http://localhost:8080/index.htmlfunktioniert es einwandfrei.

Meine App-Struktur lautet:

dirs

Mein config\WebConfig.javasieht so aus:

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

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

Ich habe versucht hinzuzufügen, registry.addResourceHandler("/").addResourceLocations("/index.html");aber es schlägt fehl.

Shoham
quelle
1
Vielleicht hilft das: stackoverflow.com/questions/20405474/spring-boot-context-root
Udo Klimaschewski
3
@UdoKlimaschewski Es zeigt, wie man kartiert, http://localhost:8080/appNameaber es ist nicht das, was ich brauche ...
Shoham
1
WebMvcConfigurerAdapter ist veraltet
user1346730

Antworten:

149

Es hätte sofort funktioniert, wenn Sie keine @EnableWebMvcAnmerkungen verwendet hätten. Wenn Sie das tun, schalten Sie alle Dinge aus, die Spring Boot für Sie erledigt WebMvcAutoConfiguration. Sie können diese Anmerkung entfernen oder den von Ihnen ausgeschalteten Ansichts-Controller wieder hinzufügen:

@Override
public void addViewControllers(ViewControllerRegistry registry) {
    registry.addViewController("/").setViewName("forward:/index.html");
}
Dave Syer
quelle
1
Danke. Ich habe nicht bemerkt, dass ... ich keine einfache Demo auf ihrer Seite finden konnte, die zeigt, dass ...
Shoham
12
Aus den Referenzdokumenten : "Wenn Sie die Spring Boot MVC-Funktionen beibehalten und nur zusätzliche MVC-Konfigurationen (Interceptors, Formatierer, View Controller usw.) hinzufügen möchten, können Sie Ihre eigene @ Bean vom Typ WebMvcConfigurerAdapter hinzufügen , jedoch ohne @EnableWebMvc"
Dave Syer
1
Dies wird dazu dienen , index.htmlauf /. Aber ist es möglich, auch den Browser zu machen eigentlich die URL ändern von /zu /index.html?
Asmaier
12
Ok, ich habe es herausgefunden. Falls Sie auch von der URL zu ändern , /zu /index.htmlverwenden , "redirect:/index.html" anstatt nach vorn.
Asmaier
4
Ich verwende die Annotation @EnableWebMvc nicht und werde nicht zu index.html umgeleitet.
Jelle
44

Ein Beispiel für die Antwort von 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
quelle
8
Verwenden Sie WebMvcConfigurer anstelle von veraltetem WebMvcConfigurerAdapter im Frühjahr 5.
Moose on the Loose
22

wenn es sich um eine Spring Boot App handelt.

Spring Boot erkennt index.html automatisch im Ordner public / static / webapp. Wenn Sie einen Controller geschrieben haben, @Requestmapping("/")überschreibt dieser die Standardfunktion und zeigt ihn nur an, index.htmlwenn Sie ihn eingebenlocalhost:8080/index.html

Krish
quelle
4
Ich habe eine src / main / resources / public / index.html Datei erstellt und es hat funktioniert! Vielen Dank
James Watkins
Ist das noch wahr?
FearX
10
@Configuration  
@EnableWebMvc  
public class WebAppConfig extends WebMvcConfigurerAdapter {  

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

}
Rodrigo Ribeiro
quelle
8

Update: Januar 2019

Erstellen Sie zuerst einen öffentlichen Ordner unter Ressourcen und erstellen Sie die Datei index.html. Verwenden Sie WebMvcConfigurer anstelle von 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.
quelle
Was könnte falsch sein, wenn dies nicht funktioniert? resources / public / index.html existiert; Java 13; Feder 2.2.2; Kater
JFFIGK
7

Wenn Sie die neueste Version spring-boot 2.1.6.RELEASEmit einer einfachen @RestControllerAnmerkung verwenden, müssen Sie nichts tun. Fügen Sie einfach Ihre index.htmlDatei unter dem resources/staticOrdner hinzu:

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

Dann klicken Sie auf die URL http: // localhost: 8080 . Hoffe, dass es allen helfen wird.

Zappee
quelle
In meinem Fall funktionierte es, aber als ich von Tomcat zu Undertow wechselte, hörte ich plötzlich auf zu arbeiten. Jetzt brauche ich einen Weg, um / zu meinem index.html weiterzuleiten
German Faller
5

Im Inneren Spring Bootlege ich die Webseiten immer in einen Ordner wie publicoder webappsoder viewsund lege sie in ein src/main/resourcesVerzeichnis, wie Sie auch sehen können application.properties.

Spring_Boot-Project-Explorer-View

und das ist mein 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

Sobald Sie die URL "Gefällt mir" servername:15800und diese vom Spring Boot besetzten Servlet-Dispatcher empfangene Anfrage eingegeben haben, wird genau nach dem gesucht, index.htmlund dieser Name wird bei Groß- und Kleinschreibung als "."spring.mvc.view.suffix HTML, JSP, HTML usw. eingestuft.

Hoffe es würde vielen helfen.

ArifMustafa
quelle
@ArifMustafa In neueren Sprint Boot-Versionen empfehle ich, Webseiten auch in Vorlagen einzufügen.
ArifMustafa
Haben Sie Referenzen dafür? Ich versuche, ein React / Redux-Frontend-Projekt mit einem Spring-Backend zu erstellen, und bin mir nicht sicher, welche Best Practices verwendet werden.
Mike
2
  1. Die Datei index.html sollte unter dem Speicherort src / resources / public / index.html ODER src / resources / static / index.html liegen. Wenn beide Speicherorte definiert sind, wird index.html aus diesem Verzeichnis aufgerufen.
  2. Der Quellcode sieht aus wie -

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

Ich hatte das gleiche Problem. Spring Boot weiß, wo sich statische HTML-Dateien befinden.

  1. Fügen Sie index.html in den Ordner resources / static ein
  2. Löschen Sie dann die vollständige Controller-Methode für den Root-Pfad wie @RequestMapping ("/") usw.
  3. Führen Sie die App aus und überprüfen Sie http: // localhost: 8080 (sollte funktionieren)
Yuriy Kiselev
quelle
0

Sie können einen RedirectViewController wie folgt hinzufügen:

@Configuration
public class WebConfiguration implements WebMvcConfigurer {

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