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.
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