Regelmäßig werden wir Single Page Applications wie Angular in einer Spring Boot Application integrieren wollen. Das lässt sich recht einfach dadurch realisieren, dass die kompilierte Angular Anwendung im „static“ Ordner der Spring Boot Anwendung abgelegt wird. In aller Regel wollen wir beim Routing in unserer Angular Anwendung eine PathLocationStrategy aktivieren („lesbare“ URLs wie „…/customer/12/details“, im Gegensatz zur HashLocationStrategy: „…/#customer/12/details“).
Das Problem: ein direkter Aufruf oder Refresh der Seite wird vom Server natürlich mit einem 404-NotFound beantwortet.
Die Lösung: alle Anfragen die nicht an unsere API gehen sollen auf den Root-Pfad (die index.html) umgeleitet werden, damit Angular das eigentliche Routing übernehmen kann:
@Controller
public class RedirectController {
@RequestMapping(value = "{path:^(?!api|public|assets)[^\\.]*}/**")
public String forward() {
return "forward:/";
}
}
Alle Anfragen, die nicht unsere statische Ressourcen oder API adressieren (api,public,assets) werden mit einem „forward“ auf unsere index.html umgeleitet.
Bis einschließlich Spring Boot 2.x war auch folgendes Pattern erlaubt: /**/{path:[^.]*} Mit Spring Boot 3.x wurde der Standard Parser für URIs jedoch von AntPathMatcher auf PathPatternParser geändert (s. https://spring.io/blog/2022/05/24/preparing-for-spring-boot-3-0#use-spring-mvcs-pathpatternparser) der eine Wildcard in dieser Form nicht mehr zulässt. Neben dem angepassten Pattern wie oben, ließe sich über die Property "spring.mvc.pathmatch.matching-strategy" jedoch auch wieder der alte Parser aktivieren