Доброго дня всем! Подружив 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?
Большое спасибо всем за внимание)!