Spring Boot: обслуживайте статические ресурсы с запасным вариантом - PullRequest
0 голосов
/ 26 сентября 2019

Моя проблема заключается в том, чтобы обслуживать приложение 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.

ИМХО, должно быть какое-то "чистое" решение для этого.Заранее спасибо.

...