2016-08-18 7 views
5

Ich arbeite derzeit an einer Webseite, die eine einzelne Seite React Front-End verwenden sollte. Für das Back-End verwende ich das Spring-Boot-Framework.SPA mit Spring Boot - serve index.html für Nicht-API-Anfragen

Alle API-Aufrufe müssen eine URL mit dem Präfix /api verwenden und sollten von den REST-Controllern verarbeitet werden.

Alle anderen URLs sollten einfach die Datei index.html dienen. Wie würde ich das mit dem Frühling erreichen?

Antwort

4

Der einfachste Weg, um das zu erreichen, was Sie wollen, ist die Implementierung eines benutzerdefinierten 404-Handlers.

diese params auf Ihre application.properties hinzufügen:

spring.resources.add-mappings=false 
spring.mvc.throw-exception-if-no-handler-found=true 

Erste Eigenschaft alle statischen Handhabung Ressource Standard entfernt, deaktiviert die zweite Eigenschaft Spring Standard White-Label-Seite (von Spring Standard fängt NoHandlerFoundException und dient Standard-White-Label-Seite)

hinzufügen 404 Handler Ihre Anwendungskontext:

import org.springframework.web.bind.annotation.ControllerAdvice; 
import org.springframework.web.bind.annotation.ExceptionHandler; 
import org.springframework.web.servlet.NoHandlerFoundException; 
import javax.servlet.http.HttpServletRequest; 

@ControllerAdvice 
public class PageNotFoundController { 
    @ExceptionHandler(NoHandlerFoundException.class) 
    public String handleError404() { 
      return "redirect:/index.html"; 
    } 
} 

Am Ende müssen Sie Ihre benutzerdefinierte Ansicht Resolver für die Bedienung Ihrer statischen Inhalt (index.html in diesem Fall)

import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.web.servlet.ViewResolver; 
import org.springframework.web.servlet.config.annotation.EnableWebMvc; 
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; 
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; 
import org.springframework.web.servlet.view.InternalResourceView; 
import org.springframework.web.servlet.view.UrlBasedViewResolver; 

@Configuration 
@EnableWebMvc 
public class WebConfig extends WebMvcConfigurerAdapter { 

    @Override 
    public void addResourceHandlers(ResourceHandlerRegistry registry) { 
     registry.addResourceHandler("/index.html").addResourceLocations("classpath:/static/index.html"); 
     super.addResourceHandlers(registry); 
    } 

    @Bean 
    public ViewResolver viewResolver() { 
     UrlBasedViewResolver viewResolver = new UrlBasedViewResolver(); 
     viewResolver.setViewClass(InternalResourceView.class); 
     return viewResolver; 
    } 

} 

Ihr index.html sollte in /resources/static/ Verzeichnis platziert werden hinzuzufügen.