Solución:
Este es el ejemplo completo de Spring Boot 2.0:
@Configuration
public class WebApplicationConfig implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/notFound").setViewName("forward:/index.html");
}
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> containerCustomizer() {
return container -> {
container.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND,
"/notFound"));
};
}
}
Esto debería funcionar: agregue una página de error para 404 que se enrute a /notFound
y reenviarlo a su SPA (asumiendo que la entrada está en /index.html
):
@Configuration
public class WebApplicationConfig extends WebMvcConfigurerAdapter {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/notFound").setViewName("forward:/index.html");
}
@Bean
public EmbeddedServletContainerCustomizer containerCustomizer() {
return container -> {
container.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND,
"/notFound"));
};
}
}
En caso de que alguien se tropiece aquí buscando cómo manejar Angular / React / otras rutas y rutas en una aplicación Spring Boot, pero no siempre devuelve index.html para cualquier 404, se puede hacer en un RequestMapping de controlador Spring estándar. Esto se puede hacer sin agregar controladores de vista y / o personalizar la página de error del contenedor.
RequestMapping admite comodines, por lo que puede hacer que coincida con un conjunto de rutas bien conocidas (es decir, rutas angulares, etc.) en su aplicación y solo luego regresar index.html:
@Controller
public class Html5PathsController {
@RequestMapping( method = {RequestMethod.OPTIONS, RequestMethod.GET}, path = {"/path1/**", "/path2/**", "https://foroayuda.es/"} )
public String forwardAngularPaths() {
return "forward:/index.html";
}
}
Otra opción (tomada de un antiguo artículo de Spring aquí: https://spring.io/blog/2015/05/13/modularizing-the-client-angular-js-and-spring-security-part-vii) es usar una convención de nomenclatura:
@Controller
public class Html5PathsController {
@RequestMapping(value = "/{[path:[^\.]*}")
public String redirect() {
return "forward:/index.html";
}
}
La configuración anterior coincidirá con todas las rutas que no contengan un punto y que aún no estén asignadas a otro controlador.