我正在开发一个Angular2 + Spring Boot应用程序,现在我有:
后端:1个@RestController,其方法用@RequestMapping注释,例如。
@RequestMapping("/main")
public Band[] main(@RequestParam(value="numberOfBands", required=false, defaultValue="3") int numberOfBands) throws ClientProtocolException, IOException {
return random(numberOfBands);
}
前端:app.routing.ts,重定向到'/ main'
{
path: '',
redirectTo: 'main',
pathMatch: 'full'
},
初始化后,我的main.component.ts向spring发送请求并获取一个对象数组作为响应;该组件如下所示:
export class MainComponent {
bands: Band[];
errorMessage: string;
constructor(private bandService: BandService){
//this.bands = new Array(3);
bandService.getRandomBands(3)
.subscribe(
bands => this.bands = bands,
error => this.errorMessage = <any>error);
}
}
当转到http://localhost:8090/
时,应用重定向到/main
,并且乐队正确传递并由组件解析。但每当我尝试重新加载页面http://localhost:8090/main
时,我只会得到简单的JSON,看起来我的组件没有正确初始化。
我希望spring boot忽略地址栏中的路径,所以它只与客户端有关
问题是:它是服务器端的问题还是以某种方式以不合适的方式初始化我的组件?
更新
我已经为我的所有@RequestMappings添加了前缀“/ api”并添加了一个过滤器,看起来如下('equals'只是为了测试功能):
if(requestURI.equals("/main")){
RequestDispatcher requestDispatcher = httpServletRequest.getRequestDispatcher("/");
requestDispatcher.forward(req, res);
}
chain.doFilter(req, res);
之后,转发过程按预期进行。
答案 0 :(得分:0)
刷新将始终向服务器发送请求。将所有REST API后端置于特定路径下,例如/api/...
,以便&#34; fake&#34;角度应用程序使用的URL不会与后端的真实URL冲突。
然后配置一个过滤器,以便将所有请求转发给那些&#34; fake&#34;角网址为/index.html
。
因此,您的过滤器会拦截对/main
的请求,该请求将转发到index.html。角度应用程序将启动。路由器将转到/main
的路由。该组件将向/api/main
发送AJAX请求。此请求将不由过滤器转发到/index.html,因此Spring REST控制器将处理它并提供JSON。