Как настроить роутинг Angular 2 + Spring?

Доброго дня всем! Подружив Angular 2 со Spring-ом, столкнулся с проблемой маршрутизации, и у меня появилось несколько вопросов:
Необходимо, чтобы на все запросы к серверу он возвращал index.html, т.е мою стартовую страницу. А дальше уже сам Angular все "разруливал". Angular же общается с моим сервером через /api. Но я уверен, что не до конца правильно понимаю все участки моей цепи, потому что все попросту работает не так как я хочу =) Ниже я приведу код и что по-моему мнению он должен делать:

Через адресную строку я ввожу адрес моего сайта(в данном случае он крутиться на моей локальной машине : localhost:8080/). Далее контроллер обрабатывает запрос:

По идее, в данном случае, на любой запрос будет возвращена index.html, если только запрос не будет состоять из нескольких "/", имею ввиду : /smth/veryusefullinformation. В этом случае запрос не должен быть обработан этим контроллером.
@RequestMapping(value = "/**", method = RequestMethod.GET)
    public String welcome() {       
        return "views/index.html";


Но, чтобы я не вводил после "/" мне вернется 404 ошибка.Если я ввиду localhost:8080, то все корректно возвращается.

Так же пробовал решить эту проблему следующим способом, но это тоже не помогает:
@RequestMapping(value = "/{value}", method = RequestMethod.GET)
  public String welcome(@PathVariable("value") String value) {
        if (value instanceof String)
            return "views/index.html";
            else return "views/index.html";
  }


Для полноты картины покажу как я отдаю представления. ViewResolver-ы не настраивал, т.к понял, что статическую страницу можно отдавать просто определив ресурсы(Может и тут кроется мое заблуждение):

@Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**").addResourceLocations("/");
    }


Даже если решится вопрос выше, но как тогда этот маршрутизация в ангуляре работает?Ведь если я ввиду адрес: localhost:8080/catalog/toys/pinkunicorn, то чтобы все корректно сработало, сервер, должен вернуть index.html и, скорее всего сохранить Url сверху, чтобы Angular смог все отобразить до требуемого места в каталоге. Понимаю, что рассуждения мои могут быть глупы, но в теле ответа, я разгадки не нашел. Замечу, чтобы не приписывать все время после localhost:8080/#, я обозначил в html: . А вот самый верхний уровень Angular-a:

import {Component} from "angular2/core";
import {ROUTER_DIRECTIVES} from "angular2/router";
import {RouteConfig} from "angular2/router";
import {SiteRoot} from "./site/siteRoot.component";
import {AdminPanelRoot} from "./adminPanel/adminPanelRoot.component";

@Component({
    selector: 'root-app',
    template: `
        <a [routerLink]="['/SiteRoot']">Site</a>
        <a [routerLink]="['/AdminPanelRoot']">Admin</a>
        <router-outlet></router-outlet>

        `,
    directives: [ROUTER_DIRECTIVES]
})

@RouteConfig([
    {path: "/site", name: "SiteRoot", component: SiteRoot,useAsDefault: true},
    {path: "/administrationPanel", name: "AdminPanelRoot", component: AdminPanelRoot}
])
export  class AppComponent{

}


Переходы по ссылкам осуществляются корректно, запросы к адресной строке /administrationPanel , выкидывают 404 ошибку, но если перейти по localhost:8080/#/administrationPanel , то отобразить представление SiteRoot, а не AdminPanelRoot

И еще есть одна проблема: все мои запросы будет перехватывать контроллер: "/**", по идее так должно быть, как же тогда к api обращаться, через api/smth?

Большое спасибо всем за внимание)!
  • Вопрос задан
  • 3258 просмотров
Пригласить эксперта
Ответы на вопрос 1
@goshan_p
Возможно я что то не понял... Но все статические ресурсы ( HTML, CSS, JS + img и т.д) в RESTful архитектуре обрабатываются прокси-сервером - nginx к примеру. То есть ваш прокси сервер отдает статические странички с кодом Ангуляр и JS, а уже Ангуляр общается с сервером на Spring
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы