1

Ich habe folgendes in meiner Frühlings-Boot-Konfiguration:Frühlings-Boot-Ressource-Handler-Muster für einzelne Seite Anwendungen

@Override 
public void addResourceHandlers(ResourceHandlerRegistry registry) { 
    registry.setOrder(Ordered.HIGHEST_PRECEDENCE) 
      .addResourceHandler("**/*.*") 
      .addResourceLocations("file:static/"); 
} 

Da ich eine einzelne Seite app Erstellen ich diese Ressource Handler statische Dateien bereitstellen möchten, wenn die folgende wahr ist:

  • URL nicht mit /api
  • enthält Diese Ressource Handler eine Datei startet, die den Weg von der URL entspricht

Wenn keine passende Datei vorhanden ist, sollte der Ressourcenhandler nicht mit 404 antworten, sondern den Aufruf an die Controller des Projekts weiterleiten.

In einem von ihnen, dass ich meinen Ausweich platzieren, um Anmerkung zu index.html (wieder, wenn die URL beginnt mit/api):

@GetMapping({"/**", "/"}) 

Dieser letzten Teil funktioniert gut, aber das Problem ist, dass die Handler Ressource liefert eine 404 wenn es keine übereinstimmenden Dateien gibt, anstatt den Anruf durchzulassen (ich bin an die Middleware-Muster von Node.js und Go gewöhnt) an die Controller. Wie kann ich das erreichen? Kann ich meinen eigenen Ressourcen-Handler erstellen, der mehr Middleware wie?

In Gehen Sie mit Echo zum Beispiel brauchen Sie nur HTML5 mit Skipper-Funktion aktivieren für/api:

func main() { 
    server := echo.New() 

    server.Use(middleware.Static("static")) 
    server.Use(middleware.StaticWithConfig(middleware.StaticConfig{ 
     Root: "static", 
     HTML5: true, 
     Skipper: noHTML5IfAPICallSkipper, 
    })) 

    server.Logger.Fatal(server.Start(":1323")) 
} 

func noHTML5IfAPICallSkipper(context echo.Context) bool { 
    if strings.HasPrefix(context.Path(), "/api/") { 
     return true 
    } 

    return false 
} 

Wie dieses einzelne Seite App Routing-Muster im Frühjahr Stiefel ermöglichen?

Oh, und übrigens, es ist entscheidend, dass die statischen Dateien von der Festplatte geliefert werden, anstatt von einem Klassenpfad oder irgendetwas anderes, das in einem Glas verpackt ist. Dieser Dienst wird mit Docker ausgeführt und es muss möglich sein, die Dateien von außerhalb des Containers bereitzustellen.

+1

https://stackoverflow.com/a/47427729/1032167 wahrscheinlich ähnlich, ich endete mit Ansatz mit benutzerdefinierten 'ResourceResolver' up. Sie können in dieser benutzerdefinierten 'ResourceResolver'-Datei einen beliebigen Speicherort angeben: Datei oder Klassenpfad. Es ist nur eine Richtung, die Sie betrachten sollten, da die Linkantwort niemals etwas an den Controller übergibt und die Indexseite fast für jede Anfrage zurückgibt, außer für statische Dateien/api/benutzerdefinierte Controller. – varren

Antwort

1

Versuchen mit diesem:

public class Application extends WebMvcConfigurerAdapter { // or implements WebMvcConfigurer (Spring Boot 2) 

    @Value("${static.path}") 
    private String staticPath; 

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

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

    ... 
} 

Sie müssen zu application.properties hinzufügen Datei der Zeile:

`static.path=path/to/static/content` 

Wenn Sie Docker verwenden, muß dieser Weg zu internem Docker Behälter referenzieren Verzeichnis, ein Beispiel: /opt/app/statics und dann, den externen Pfad zu diesem:

Sie müssen der Datei application.properties die Zeile hinzufügen: static.path=/opt/app/statics

und führen Docker wie folgt aus:

docker run ... -v /absolute/static/path/at/host:/opt/app/statics image:version

Verwandte Themen