Моя проблема заключается в том, чтобы обслуживать приложение Angular 8 с Spring Boot 2 / Spring 5. Я хочу обслуживать приложение Angular (static html, css, js) в src/main/resources/app
в http://localhost:8080/app. Это в основномне проблема, потому что Spring способен обслуживать статические ресурсы, помещая их в src/main/resources/static/app
, и это выполняет половину работы ...
Но я хочу, чтобы Spring обслуживал статические файлы в этом каталоге, если онисуществует, поэтому сопоставление от http://localhost:8080/app/subdir/some.js до src/main/resources/app/subdir/some.js
обычно должно решить эту проблему.но если файл не существует (404), я хочу использовать src/main/resources/app/index.html
как запасной вариант (со статусом 200), но только когда путь совпадает с /app/**
, потому что Spring не понимает маршрутизацию на стороне клиента Angular.Если путь не совпадает с /app/**
, должно быть подано нормальное значение 404.
Логически:
if(patch matches: static file)
=> serve static file from `src/main/resources/app/`
if(path matches: /app/** && NOT_FOUND)
=> serve `src/main/resources/app/index.html`
else
=> serve 404 error
Уродливый хак, который не совсем работает: Я как-то справляюсь с этим, помещая статические файлы в src/main/resources/static/app
и добавляя пользовательский контроллер ошибок, подобный следующему:
@Controller
class CustomErrorController : ErrorController {
@RequestMapping("/error")
fun handleError(request: HttpServletRequest): String {
val statusCode = request.getAttribute("javax.servlet.error.status_code") as Int
val uri = request.getAttribute(RequestDispatcher.FORWARD_REQUEST_URI) as String?
return when {
statusCode == HttpStatus.NOT_FOUND.value() && uri?.startsWith("/app") ?: false ->
"forward:/app/index.html"
else ->
"error/404.html"
}
}
override fun getErrorPath(): String {
return "/error"
}
}
Но это кажется уродливым обходным путем, и он служит index.htmlс кодом статуса 404, который не нужен.
Контекстная информация:
- Также используется механизм шаблонов pebble, который обслуживает серверный рендеринг html за пределами
/app
. - Также предоставляя конечные точки отдыха за пределами
/app
.
ИМХО, должно быть какое-то "чистое" решение для этого.Заранее спасибо.