Я пытаюсь создать SPA-сервер (статический контент-сервер, API) с некоторыми дополнительными функциями / элементами управления, которые требуют гибкой перезаписи / маршрутизации / обработки URL.Эти требования трудно совместить, несмотря на то, что я попробовал подход в некоторых похожих ответах, которые я прочитал здесь.
Что мне нужно сделать:
- Служить статическим ресурсам (js, images, css, html и т. Д.) Из пути URL: / assets /
- Сохранить этистатические ресурсы в каталоге файловой системы и отображение по указанному выше пути
- Для любого запроса статического ресурса, не найденного, вернуть 404
- Expose REST API из набора именованных путей URL: / api / и /anotherapi / etc ...
- Для всех других запросов вне этих путей URL, используйте /index.htm для начальной загрузки SPA
Пока у меня есть следующее ...
Для API-интерфейсов REST:
@RestController
@RequestMapping(value="/api/**")
public class StateAPIController {
@RequestMapping(value = {"/api/method1"}, method = RequestMethod.POST)
@ResponseBody
public String method1() {
return "method1...";
}
@RequestMapping(value = {"/api/method2"}, method = RequestMethod.POST)
@ResponseBody
public String method2() {
return "method2...";
}
}
(Работает нормально)
Для рендеринга статических файлов из определенного местоположения файловой системы и сопоставления "/" с "/ index.htm ":
@Configuration
@EnableWebMvc
public class AssetServerConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry
.addResourceHandler("/")
.addResourceLocations("file:/some/path/index.htm");
registry
.addResourceHandler("/assets/**")
.addResourceLocations("file:/some/path/assets/");
}
@Bean
public ViewResolver viewResolver() {
UrlBasedViewResolver viewResolver = new UrlBasedViewResolver();
viewResolver.setViewClass(InternalResourceView.class);
return viewResolver;
}
}
(это работает, но не уверен, если лучший способ решить эту проблему)
Для перенаправления / пересылки любых других запросов (вне этих зарезервированных путей) в" /"(и, следовательно," /index.htm"):
@ControllerAdvice
@RequestMapping(value="/**")
public class AssetServerController {
@RequestMapping(value = {"/**/{path:[^\\.]*}", "/{path:^(?!/assets/).*}", "/{path:^(?!/api/).*}"}, method = RequestMethod.GET)
public String index() {
return "forward:/";
}
}
(это только частично работает ... и основная проблема, с которой мне нужна помощь)
Итак, вот янеобходимо исключить список путей (/ assets / & / api /), но это становится трудно сделать правильно с фильтром regex / AntPathMatcher в RequestMapping, и имеет оба ложных совпадения (показывая index.htm, когда это не следует делать) и пропускает (показывая 404s, когда он должен показать index.htm).
Из-за вышеизложенного я также не могу правильно обслуживать 404-е, когда ресурс отсутствует по одному из зарезервированных путей (например, ресурсов).
a) Каков наилучший способ приблизиться к этому?Я правильно понял?Есть ли лучший способ?
б) как заставить работать регулярное выражение, так как оно не соответствует нормальным правилам регулярного выражения, и примеры, которые я видел до сих пор, не достигают моей цели ....